VC中调用fortran有哪些方法
1个回答
展开全部
声明:以下内容为转载,希望有用
前几天,导师要求在vc下调用fortran,对于我来说真是头疼啊,呵呵,以前也没有接触过这样的工作。没有办法,只好先查找资料然后再做了。
还好网上这样的资料确实不少。虽然说都说得不是很详细,但是综合一下,也差不多了。基本上是搞懂了,现在只是把作为一个新手的需要注意到的问题,而哪些文献上没有谈到的说一下。以及说一下可能调用不成功的原因。
首先给出一个例子,这里只给出fortran子程序的头,具体代码略去。
fortran子函数:
subroutine testvc(x1,x2,x3,x4,x5)
!ms$if .not. defined(LINKDIRECT)
!ms$attributes dllexport :: TESTVC
!ms$endif
real*4 x1 [value]
real*4 x2 [value]
real*4 x3 [value]
integer*4 x4 [value]
integer*2 x5 [reference]
cc 程序代码 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编程不熟悉的。
注意字节长度的传递,这点非常重要,如果长度和fortran下的不一致,调试和连接都没有错误,但是就是不能成功的执行。
要注意程序的自动检查,无论是载入库,还是载入fortran子函数,都要适当的检验一下是否载入成功,这样方便调试和查错!
还需要注意的,暂时忘记了,呵呵,记起来了在补充啊。
前几天,导师要求在vc下调用fortran,对于我来说真是头疼啊,呵呵,以前也没有接触过这样的工作。没有办法,只好先查找资料然后再做了。
还好网上这样的资料确实不少。虽然说都说得不是很详细,但是综合一下,也差不多了。基本上是搞懂了,现在只是把作为一个新手的需要注意到的问题,而哪些文献上没有谈到的说一下。以及说一下可能调用不成功的原因。
首先给出一个例子,这里只给出fortran子程序的头,具体代码略去。
fortran子函数:
subroutine testvc(x1,x2,x3,x4,x5)
!ms$if .not. defined(LINKDIRECT)
!ms$attributes dllexport :: TESTVC
!ms$endif
real*4 x1 [value]
real*4 x2 [value]
real*4 x3 [value]
integer*4 x4 [value]
integer*2 x5 [reference]
cc 程序代码 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编程不熟悉的。
注意字节长度的传递,这点非常重要,如果长度和fortran下的不一致,调试和连接都没有错误,但是就是不能成功的执行。
要注意程序的自动检查,无论是载入库,还是载入fortran子函数,都要适当的检验一下是否载入成功,这样方便调试和查错!
还需要注意的,暂时忘记了,呵呵,记起来了在补充啊。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询