声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2575|回复: 2

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

[复制链接]
发表于 2006-9-8 17:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
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[5], T[1]);这一语句输出为:
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[2],D[9];
    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[5], T[1]);


                fclose(fpout);
               
}
回复
分享到:

使用道具 举报

 楼主| 发表于 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

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-19 14:25 , Processed in 0.059712 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表