Fortran Coder

查看: 9518|回复: 6
打印 上一主题 下一主题

[混编] dll调用问题

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
11 点
跳转到指定楼层
楼主
发表于 2015-3-11 12:08:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,故请高手们能答疑解惑,问题出在哪里?
  



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2015-3-11 13:24:11 | 只看该作者
SUBROUTINE FSTIF(A,B,XO,FK,XM,DENF)

改为

SUBROUTINE FSTIF(A,B,X0,FK,XM,DENF)

4

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
11 点
板凳
 楼主| 发表于 2015-3-11 15:49:13 | 只看该作者
楚香饭 发表于 2015-3-11 13:24
SUBROUTINE FSTIF(A,B,XO,FK,XM,DENF)

改为

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

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2015-3-11 16:02:36 | 只看该作者
零 和 欧 肯定是不同的,任何语言都是这样。

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

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

4

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
11 点
5#
 楼主| 发表于 2015-3-11 19:33:22 | 只看该作者
楚香饭 发表于 2015-3-11 16:02
零 和 欧 肯定是不同的,任何语言都是这样。

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

我用的Intel Visual Fortran, 零和大欧长的一样.我也根本没想到原因会出在这里.
非常感谢你的帮助,受教了.

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

6#
发表于 2015-3-12 09:23:56 | 只看该作者
本帖最后由 楚香饭 于 2015-3-12 09:27 编辑

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

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

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

4

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
11 点
7#
 楼主| 发表于 2015-3-12 09:57:22 | 只看该作者
楚香饭 发表于 2015-3-12 09:23
稍微完善一点的编辑器都可以设置字体的。Visual Studio 做为一流的商业编译环境,当然也可以。

你可以点击 ...

换个字体效果果然不一样啊,需要学的东西还有很多.
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-14 07:48

Powered by Tencent X3.4

© 2013-2024 Tencent

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