|
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,故请高手们能答疑解惑,问题出在哪里?
|
|