别问我是谁 发表于 2006-4-6 09:56:11

(原创)个人的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群大力欢迎有志之士加入,把科学计算语言发扬光大。
谢谢!

xiongdi 发表于 2006-4-7 16:21:33

Re:(原创)个人的matlab,fortran,vc混合编程体会,附上fortran的一个qq群(23

学点.

紫衣天使2003 发表于 2006-7-5 09:22:09

你的群号到底是多少啊?怎么不对呢?

xuguangyue2001 发表于 2006-7-5 20:06:26

群号是23150605

ansenyue 发表于 2008-6-22 20:41:02

请教调用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
望不吝赐教

ansenyue 发表于 2008-6-22 20:54:26

请教调用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]
查看完整版本: (原创)个人的matlab,fortran,vc混合编程体会,附上fortran的一个qq群(23150