VC中的源程序如下:
#include "stdio.h"
#include "windows.h"//#define fincr FINCR//extern "C" {float __stdcall fincr( float *x );}/* a function to return x+1 */void main()
{
int i;
float x = 0 ; HINSTANCE hIns;
hIns = LoadLibraryEx("FortranDLLC.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
typedef float (*MYPROC)(float &x);
MYPROC fun = (MYPROC)GetProcAddress(hIns,"_FINCR@8"); for ( i = 0 ; i < 5 ; i++ )
{
printf("\n %f plus 1 = %f ", x, (*fun)( x ) );
x = x + 1 ;
}
printf("\n");
FreeLibrary(hIns);
}fortran源程序如下:
!DEC $ATTRIBUTES DLLEXPORT :: FINCR
real function fincr( x )
real x
fincr = x + 1
return
end
fortran中生成dll在vc中调用,但是编译通过了,运行却出错!
是不是VC中还要一些调用dll的语句?
还望高手指教!先谢谢了!
#include "stdio.h"
#include "windows.h"//#define fincr FINCR//extern "C" {float __stdcall fincr( float *x );}/* a function to return x+1 */void main()
{
int i;
float x = 0 ; HINSTANCE hIns;
hIns = LoadLibraryEx("FortranDLLC.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
typedef float (*MYPROC)(float &x);
MYPROC fun = (MYPROC)GetProcAddress(hIns,"_FINCR@8"); for ( i = 0 ; i < 5 ; i++ )
{
printf("\n %f plus 1 = %f ", x, (*fun)( x ) );
x = x + 1 ;
}
printf("\n");
FreeLibrary(hIns);
}fortran源程序如下:
!DEC $ATTRIBUTES DLLEXPORT :: FINCR
real function fincr( x )
real x
fincr = x + 1
return
end
fortran中生成dll在vc中调用,但是编译通过了,运行却出错!
是不是VC中还要一些调用dll的语句?
还望高手指教!先谢谢了!
动态库函数名称不叫这个吧?不是FINCR嘛
@后面的数字是参数个数乘4,
这儿我写错了!应该是4
那上面的文档说明如下:
在vc中用LoadLibraryEx得到该模块的句柄,用GetProcAddress定位该函数的指针
函数名称为_funname@number number为参数个数乘以4
一 、VC调用 FORTRAN 的方式
为便于编译和调试程序(尤其在 VC 和 FORTRAN 使用不同公司的编译器时),对于多语言编程的应用程序,通常以 DLL 来实现相互间的调用。可以把被调用的 FORTRAN 过程做到 DLL 中,并保证 C 与所调用的 FORTRAN 函数都具有相同的接口。
调用应采用动态加载(显式链接)方式。使用动态加载的应用程序必须使用 LoadLibrary() 函数加载 DLL 并得到一个模块句柄。然后使用该句柄调用 GetProcAddress() 函数获得所需调用的导出函数的指针,并通过该指针调用 DLL 中的导出函数。在使用完毕之后,还需调用 FreeLibrary() 函数释放加载的 DLL 。
二、要注意的问题:
为使调用过程正确,在主程序中应注明被调用过程的属性为“ C”属性(extern "C")。同样,FORTRAN 过程的参数也都必须以 INTERFACE 语句指定各变元为“ C”属性(var_name [C])。
指定子过程和变元属性非常重要,因为 C 与 FORTRN 调用子过程时的参数入栈次序正好相反,指定相同的属性可保证调用时参数正确传递。此外,由于 C 通过传值方式传递参数,FORTRAN 则通过传址方式传递参数,对于大数据量的参数(如数组、结构变量)等,还需指定变量遗传址方式传递,以减小系统开销。好像没说要带参数啊
全是零啊?