Fortran Coder

标题: dll调用问题 [打印本页]

作者: fortn11    时间: 2015-3-11 12:08
标题: dll调用问题
fortan新人在编程过程中遇到了问题,纠结了两天无果,特向高手们请教。
  我想用VB调用fortran的DLL,使用fortran本身可以计算成功。但用VB调用dll时程序停止工作。之后尝试用fortran调用dll,输出结果为NaN。使用的是老程序,结构可能不好。原程序代码如下:
[Fortran] 纯文本查看 复制代码

        PROGRAM FSTIF
        REAL A,B,X0,FK(4,4),XM,DENF
        DIMENSION A1(4,4),A2(4,4),A3(4,4)
        A=18.0                       ! 测试程序我自己赋的值
        B=12.0                        !同上
        X0=54.0                      !同上
        DENF=0.035885        !同上
        XM=1.0                      !同上
        DO 12 I=1,4
        DO 12 J=1,4
        A1(I,J)=0.
        A2(I,J)=0.
12   A3(I,J)=0.
        V1=X0*B/A/6.
        A1(1,1)=2.*V1
        A1(2,2)=2.*V1
        A1(3,3)=2.*V1
        A1(4,4)=2.*V1
        A1(1,2)=-2.0*V1
        A1(2,1)=-2.0*V1
        A1(3,4)=-2.0*V1
        A1(4,3)=-2.0*V1
        A1(1,3)=-1.0*V1  
        A1(3,1)=-1.0*V1  
        A1(2,4)=-1.0*V1  
        A1(4,2)=-1.0*V1
        A1(2,3)=V1
        A1(3,2)=V1
        A1(1,4)=V1
        A1(4,1)=V1
   2   V2=X0*A/B/6.
        A2(1,1)=(2.-A/X0)*V2
        A2(4,4)=(2.-A/X0)*V2
        A2(1,3)=-V2
        A2(3,1)=-V2
        A2(2,4)=-V2
        A2(4,2)=-V2
        A2(2,2)=(2.+A/X0)*V2
        A2(3,3)=(2.+A/X0)*V2
        A2(1,4)=-(2.-A/X0)*V2
        A2(4,1)=-(2.-A/X0)*V2
        A2(2,3)=-(2.+A/X0)*V2
        A2(3,2)=-(2.+A/X0)*V2
        A2(1,2)=V2
        A2(2,1)=V2
        A2(3,4)=V2
        A2(4,3)=V2
   3   V3=B/A/A/12.
        IF(A .EQ. X0) X0=X0+.001
        E1=((A+X0)*(A+X0)*ALOG((X0+A)/(X0-A))-2.*A*(2.*A+X0))*V3
        E2=((A-X0)*(A-X0)*ALOG((X0+A)/(X0-A))+2.*A*(2.*A-X0))*V3
        E3=((A-X0)*(A+X0)*ALOG((X0+A)/(X0-A))+2.*A*X0)*V3
        IF(A .EQ. X0) X0=X0-.001
        A3(1,1)=2.*E1
        A3(4,4)=2.*E1  
         A3(2,2)=2.*E2
        A3(3,3)=2.*E2
        A3(1,2)=2.*E3
        A3(2,1)=2.*E3
        A3(3,4)=2.*E3
        A3(4,3)=2.*E3
        A3(1,3)=E3
        A3(3,1)=E3
        A3(2,4)=E3
        A3(4,2)=E3
        A3(1,4)=E1
        A3(4,1)=E1
        A3(2,3)=E1
        A3(3,2)=E2
        DO 10 I=1,4
        DO 10 J=1,4
10   FK(I,J)=3.14159*(A1(I,J)+A2(I,J)+A3(I,J)*XM*XM)/DENF
        PRINT *, ((FK(I,J),J=1 ,4),I=1,4)
        END

以上程序可以运行并能输出结果。下面是把程序该为dll的代码:
[Fortran] 纯文本查看 复制代码
SUBROUTINE FSTIF(A,B,XO,FK,XM,DENF)
       !DEC$ attributes dllexport ::FSTIF
       REAL A,B,X0,FK(4,4),XM,DENF
       DIMENSION A1(4,4),A2(4,4),A3(4,4)
       DO 12 I=1,4
       DO 12 J=1,4
       A1(I,J)=0.
       A2(I,J)=0.

后面的都一样了,不粘了。用fortran做了个简单的调用dll的程序:
[Fortran] 纯文本查看 复制代码
PROGRAM SFTIFss
      REAL A,B,X0,XM,DENF,FK(4,4)
      DO 10 I=1,4
      DO 10 J=1,4
10  FK(I,J)=0.0
      A=18.0
      B=12.0
      X0=54.0
      DENF=0.035885
      XM=1.0
      CALL FSTIF(A,B,X0,FK,XM,DENF)
      PRINT *, ((FK(I,J),J=1,4),I=1,4)
      END

但输出结果全为NaN,故请高手们能答疑解惑,问题出在哪里?
  




作者: 楚香饭    时间: 2015-3-11 13:24
SUBROUTINE FSTIF(A,B,XO,FK,XM,DENF)

改为

SUBROUTINE FSTIF(A,B,X0,FK,XM,DENF)
作者: fortn11    时间: 2015-3-11 15:49
楚香饭 发表于 2015-3-11 13:24
SUBROUTINE FSTIF(A,B,XO,FK,XM,DENF)

改为

原来如此,真的太感谢了,两天的时间被这个坑绊住了.
fortran里o和零不分啊.按照公式解析应该是零,原程序里是o,被程序员坑了.

作者: 楚香饭    时间: 2015-3-11 16:02
零 和 欧 肯定是不同的,任何语言都是这样。

可能你使用的编辑器显示的字体,这两者比较类似。你可以切换一下字体,可能有利于你分辨他们。

此外,在代码中加入 Implicit None 会有利于查找这种拼写错误。

作者: fortn11    时间: 2015-3-11 19:33
楚香饭 发表于 2015-3-11 16:02
零 和 欧 肯定是不同的,任何语言都是这样。

可能你使用的编辑器显示的字体,这两者比较类似。你可以切换 ...

我用的Intel Visual Fortran, 零和大欧长的一样.我也根本没想到原因会出在这里.
非常感谢你的帮助,受教了.
作者: 楚香饭    时间: 2015-3-12 09:23
本帖最后由 楚香饭 于 2015-3-12 09:27 编辑

稍微完善一点的编辑器都可以设置字体的。Visual Studio 做为一流的商业编译环境,当然也可以。

你可以点击 工具菜单,选项,在里面找到 环境,字体和颜色。进行修改。

推荐的编程字体有很多,比如 Consolas

作者: fortn11    时间: 2015-3-12 09:57
楚香饭 发表于 2015-3-12 09:23
稍微完善一点的编辑器都可以设置字体的。Visual Studio 做为一流的商业编译环境,当然也可以。

你可以点击 ...

换个字体效果果然不一样啊,需要学的东西还有很多.




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2