【发布时间】:2013-11-14 22:01:03
【问题描述】:
我是 FORTRAN 的绝对初学者,我煞费苦心地将一个 1000 行的 FORTRAN 源文件转换为 MATLAB 以供我自己使用。到目前为止,我通过放入大量 PRINT 语句来跟踪变量并确保数学正常工作,这一切都很好。我在 FORTRAN 中遇到了一件我无法解决的奇怪事情。
有一个子程序是这样定义的
subroutine addprc
complex tmat,b,ci,c1,c2,cim,ab1(50),ab2(50),acans(10,2),fg1(50),fg2(50)
common dtr,rtd,pi
common /mtxcom/ nrank,nranki,tmat(50,50),b(50,50),cmxnrm(25)
common /cmvcom/ nm,kmv,cmv,twm,prodm
下面还有更多common 和dimension 分配,但它们不应该相关。第一次定义ab1(50) 数组是在这个子例程中。对于我的 MATLAB 脚本,我已将其初始化为 ab1=zeros(1,50);。然后在这个循环中使用它(在 FORTRAN 中):
do 20 n = 1,nrank
np = n+nrank
cn = real(n)
n1 = n+1
c1 = 4.0*ci**n
c2 = 4.0*ci**n1
p1 = cn*costh*pnmllg(n1)-(cn+cmv)*pnmllg(n)
p2 = cmv*pnmllg(n1)
ab1(n-ij) = c1*p2*uu1
ab1(np-ijt) = -c2*p1*uu1
ab2(n-ij) = -c1*p1*uu2
ab2(np-ijt) = c2*p2*uu2
此时我已经检查了所有其他变量的值,它们与我的 MATLAB 脚本一致。向后工作我发现ab1 已经包含值的问题。循环之前的打印命令,例如
PRINT *,'before ab1', SUM(ab1)
do 20 n = 1,1
返回(107.500008, 5.38305187)。它是一个复数,所以这两个值都很好,但有什么不好的是它里面有什么东西呢?事实上,唯一一次使用ab1 就是在这段代码中。
这里有什么我遗漏的吗?我查看了源文件 (ctrl-f:ab1) 以找到它的任何实例。原始源代码是一个 .for 文件,我在 Eclipse 下使用 gfortran 编译了它们。谢谢你的时间。
【问题讨论】:
-
re:公共块无关紧要,请注意,如果符号是公共块,则其他程序单元可能会使用不同的符号名称访问该公共块。
-
ijijt循环在哪里? -
@george:我确实从其他变量中注意到了这种行为。我唯一不确定的是如何知道它在使用什么,因为这是第一次定义
ab1。 @ja72ijijt循环稍早定义如下。ij = kmv-1, if(ij.lt.0), ij = 0 ijt = 2*ij所以没什么太花哨的。