wahaha_2002 发表于 2006-9-8 17:28

VC6调用Fortran程序,无法返回计算的输出值!

VC6调用Fortran程序,无法返回计算的输出值!

GTD7(&IYD,&SEC,&ALT,&GLAT,&GLONG,&STL,&F107A,&F107,&AP,&MASS,D,T),是fortran程序,前面是输入参数,D和T都是数组,是输出的计算结果

调试过程中,GTD7()函数内部计算正确,但是返回后没有值,
fprintf(fpout," out:::::::\n%8.5f %8.5f\n", D, T);这一语句输出为:
out:::::::
-92559631349317831000000000000000000000000000000000000000000000.00000 -92559631349317831000000000000000000000000000000000000000000000.00000


GTD7为F77程序在Compaq Visual Fortran version 6.6 编译生成的DLL和LIB。
文件头部代码:
      SUBROUTINE GTD7(IYD,SEC,ALT,GLAT,GLONG,STL,F107A,F107,AP,MASS,D,T)
!DEC$ ATTRIBUTES DLLEXPORT::GTD7
C!DEC$ ATTRIBUTES C, ALIAS:'_GTD7' :: GTD7
C       NRLMSISE-00

(计算MSISE-00大气模型的程序)
通常可以使用“!DEC$ ATTRIBUTES C, ALIAS:'_GTD7' :: GTD7”代码来强制输出由Fortran的传址改为C语言的传值,但是可能F77不支持这行语句,加这一行语句就报错。

不知道该怎么解决VC程序调用Fortran程序,无法输出返回参数值的问题,谢谢!

下面程序中,
void CC_FDoc::OnFileNew()
{
        int IYD,MASS;
        double SEC,ALT,GLAT,GLONG,STL,F107A,F107,AP;
        double D1,D2,D3,D4,D5,D6,D7,D8,D9;
        double T1,T2;
        double T,D;
    double bb=10.0;

        fpout = fopen("outdata.txt","w");

                IYD=172; /* without effect */
                SEC=29000;
                ALT=30;
                GLAT = 60;
                GLONG = -70;
                STL = 16;
                F107A=150;
                F107=150;
                AP=4;
                MASS = 48;
      

        GTD7(&IYD,&SEC,&ALT,&GLAT,&GLONG,&STL,&F107A,&F107,&AP,&MASS,D,T);
      fprintf(fpout," out:::::::\n%8.5f %8.5f\n", D, T);


                fclose(fpout);
               
}

wahaha_2002 发表于 2006-9-8 17:37

在Fortran里面如何设置,可以传递返回参数?

风花雪月 发表于 2006-9-10 08:26

将Fortran做成DLL是可以的,但是fortran程序中不能有屏幕交互的语句,

如READ(*,*),WRITE(*,*)等等;

否则就会运行过程中就会退出。


一般将FORTRAN程序做成DLL,在声明函数时应该如下:

SUBROUTINE MYDLLFUN
!MS$ATTRIBUTES DLLEXPORT :: MyDllFun

表示是可以输出的函数。

然后在连接时用 /DLL选项。

在C语言中,首先要声明这个函数:

extern "C"
{

__declspec(dllimport) void __stdcall MyDllFun(参数列表)

};

这里要采用__stdcall方式声明在fortran里的函数,C默认是__cdecl。

调用过程中要注意参数类型的转换,特别是字符串类型和多维数组。
C语言中字符串是以'\0'结尾的,而Fortran中没有这个要求。C语言
的多维数组是行优先的,而Fortran里面是列优先。
页: [1]
查看完整版本: VC6调用Fortran程序,无法返回计算的输出值!