(原创)个人的matlab,fortran,vc混合编程体会,附上fortran的一个qq群(23150
近期来,做fortran,matlab,vc的混合编程较多。不过一般都是在matlab下调用fortran,在vc下调用fortran,给一点自己的体会吧,这里不介绍方法,只说明调用不成功的可能和容易出错的地方,欢迎大家指正。vc小调用fortran:
首先给出一个例子,这里只给出fortran子程序的头,具体代码略去。
fortran子函数:
subroutine irivc(xlat,xlon,h_max,iy,imd,hour,tec)
!ms$if .not. defined(LINKDIRECT)
!ms$attributes dllexport :: testVC
!ms$endif subroutine testvc(x1,x2,x3,x4,x5) cc注意其中x1,...x5要声明为value或者reference传递
C++程序代码如下:
#i nclude "stdafx.h"
#i nclude "windows.h"
int main(int argc, char* argv[])
{
// printf("Hello World!\n");
float tec;
float ktec;
HINSTANCE hmydll;
hmydll=LoadLibrary("testvc.dll");
if (hmydll!=NULL) printf("Load seccessful\n");
else printf("load unseccessful!\n");
void (_stdcall *testVC)(float x1,float x2,float x3,int x4,float *x5);
TESTVC=(void(_stdcall *)(float x1,float x2,float x3,int x4,float *x5))
::GetProcAddress(hmydll,_TESTVC@20);
if (TESTVC!=NULL) printf("Load TESTVC successful\n");
else printf("Load TESTVC unsuccessful\n");
TESTVC(31,114,2000,2002,,&x5);
ktec=x5;
printf("tec=%f\n",x5);
需要注意到一下几点:
一定要包含windows.h头文件,这是初学者往往没有注意到的,特别是对windows编程不熟悉的。
1。注意字节长度的传递,这点非常重要,如果长度和fortran下的不一致,调试和连接都没有错误,但是就是不能成功的执行。
2。要注意程序的自动检查,无论是载入库,还是载入fortran子函数,都要适3。当的检验一下是否载入成功,这样方便调试和查错!
4。还需要注意的,暂时忘记了,呵呵,记起来了在补充啊。
matlab下调用fortran:
前几天,为了一个程序,搞了老长时间,接口程序也写好了.编译也通过了,可是,就是计算结果不对,晚上睡觉都睡不着,真是郁闷啊.总是觉得有问题,但是又不知道问题在哪里.
问了几个师兄,他们也不知道怎么回事,我做了一个测试文件试了一下,传进去的参数居然都是零,好,发现问题了就好说,既然传进去的参数都是零,那就肯定试参数类型的问题,不可能是程序本身的问题.
仔细检查程序,发现没有太大的问题,因为检查了n遍,数据类型也检查了n遍,在fortran中是real *4,在matlab中,是默认的.于是在matlab中用了一下whos,结果发现matlab中的数据类型居然是8个字节的,而在fortran中,是四个字节,问题终于找到了.把所有fortran中要调用的数据都转换成4个字节的,所有matlab中要用到的数据都转换成8个字节的,然后在matlab下编译,通过,然后做了几个算例,ok了.大功告成!
以后一定要注意数据类型的问题,还有,不仅仅是类型的问题,存储长度也要一致.否则出错了都不知道错在什么地方!
各位兄弟如果有什么问题,可以跟贴,希望一起讨论,另外,我们的fortran QQ群大力欢迎有志之士加入,把科学计算语言发扬光大。
谢谢!
Re:(原创)个人的matlab,fortran,vc混合编程体会,附上fortran的一个qq群(23
学点. 你的群号到底是多少啊?怎么不对呢? 群号是23150605请教调用FORTRAN程序问题
楼上你好!刚刚因为论文需要计算接口,一直没有成功。现在向您请教。我是用MATLAB R2007a 调用v fortran6.5程序,按照书上写小的程序试验,总是出现这样的错误mex fact.f90
Error fact.f90: 3syntax error; found `mexfunction' expecting `;'
Error fact.f90: 4extraneous old-style parameter list
Error fact.f90: 4syntax error; found `integer' expecting `;'
Error fact.f90: 4syntax error; found `plhs' expecting `;'
Error fact.f90: 4syntax error; found `*' expecting `)'
Error fact.f90: 4skipping `*'
Error fact.f90: 4syntax error; found `*' expecting `)'
Error fact.f90: 4skipping `*'
Error fact.f90: 5syntax error; found `integer' expecting `;'
Error fact.f90: 5syntax error; found `mxgetpr' expecting `;'
Error fact.f90: 6syntax error; found `integer' expecting `;'
Error fact.f90: 6syntax error; found `y_pr' expecting `;'
Error fact.f90: 7syntax error; found `integer' expecting `;'
Error fact.f90: 7syntax error; found `nlhs' expecting `;'
Error fact.f90: 8syntax error; found `integer' expecting `;'
Error fact.f90: 8syntax error; found `i' expecting `;'
Error fact.f90: 9syntax error; found `real' expecting `;'
Error fact.f90: 9syntax error; found `*' expecting `;'
Error fact.f90: 9missing identifier
Error fact.f90: 9syntax error; found `8' expecting `;'
Error fact.f90: 9too many errors
C:\PROGRA~1\MATLAB\R2007A\BIN\MEX.PL: Error: Compile of 'fact.f90' failed.
??? Error using ==> mex at 206
Unable to complete successfully.
我用的是matlab自带的编译器,编译C例子程序已经成功,就是fortran总是类似错误。
源程序是:
subroutine mexfunction(nlhs,plhs,nrhs,prhs)
integer plhs(*),prhs(*)
integer mxgetpr,mxcreatedoublematrix
integer y_pr
integer nlhs,nrhs
integer i
real*8 x,y,mxgetscalar
x=mxgetscalar(prhs(1))
prhs(1)=mxcreatedoublematrix(1,1,0)
y_pr=mxgetpr(plhs(1))
y=1.0
do i=x,1,-1
y=y*i
end do
call mxcopyreal8toptr(y,y_pr,1)
return
end
望不吝赐教
请教调用FORTRAN程序问题
楼上你好!刚刚因为论文需要计算接口,一直没有成功。现在向您请教。我是用MATLAB R2007a 调用v fortran6.5程序,按照书上写小的程序试验,总是出现这样的错误mex fact.f90
Error fact.f90: 3syntax error; found `mexfunction' expecting `;'
Error fact.f90: 4extraneous old-style parameter list
Error fact.f90: 4syntax error; found `integer' expecting `;'
Error fact.f90: 4syntax error; found `plhs' expecting `;'
Error fact.f90: 4syntax error; found `*' expecting `)'
Error fact.f90: 4skipping `*'
Error fact.f90: 4syntax error; found `*' expecting `)'
Error fact.f90: 4skipping `*'
Error fact.f90: 5syntax error; found `integer' expecting `;'
Error fact.f90: 5syntax error; found `mxgetpr' expecting `;'
Error fact.f90: 6syntax error; found `integer' expecting `;'
Error fact.f90: 6syntax error; found `y_pr' expecting `;'
Error fact.f90: 7syntax error; found `integer' expecting `;'
Error fact.f90: 7syntax error; found `nlhs' expecting `;'
Error fact.f90: 8syntax error; found `integer' expecting `;'
Error fact.f90: 8syntax error; found `i' expecting `;'
Error fact.f90: 9syntax error; found `real' expecting `;'
Error fact.f90: 9syntax error; found `*' expecting `;'
Error fact.f90: 9missing identifier
Error fact.f90: 9syntax error; found `8' expecting `;'
Error fact.f90: 9too many errors
C:\PROGRA~1\MATLAB\R2007A\BIN\MEX.PL: Error: Compile of 'fact.f90' failed.
??? Error using ==> mex at 206
Unable to complete successfully.
我用的是matlab自带的编译器,编译C例子程序已经成功,就是fortran总是类似错误。
源程序是:
subroutine mexfunction(nlhs,plhs,nrhs,prhs)
integer plhs(*),prhs(*)
integer mxgetpr,mxcreatedoublematrix
integer y_pr
integer nlhs,nrhs
integer i
real*8 x,y,mxgetscalar
x=mxgetscalar(prhs(1))
prhs(1)=mxcreatedoublematrix(1,1,0)
y_pr=mxgetpr(plhs(1))
y=1.0
do i=x,1,-1
y=y*i
end do
call mxcopyreal8toptr(y,y_pr,1)
return
end
望不吝赐教
页:
[1]