我必须处理一些遗留的 Fortran 代码。就我更喜欢用来ALLOCATE
处理数组而言,看到类似
INTEGER*4 A(1)
...
DO 90 J=1,N
A(J) = SomeValues(J)
90 CONTINUE
问题是此类数组的无声内存损坏。在其中一个被值填充后,它会由于某种未知原因而损坏。
NEQNS=0
A(1)=1
DO 100 I=1,NFULL
IND=A(I)-1
S=0
DO 90 J=1,6
IF(MASK(I,J)) THEN
S=S+1
NEQNS=NEQNS+1
B(NEQNS)=I
ENDIF
90 CONTINUE
A(I+1)=A(I)+S
100 CONTINUE
c Another array starts here to be used in next cycle
C(1)=1
DO 700 IL=1,NEQNS
I=B(IL) ! Value of B(1) is broken here!
....
调试不是那么容易,因为我有这样的手表:
或者像这样
该程序是多年前构建的,并且正在运行,但是重建的版本已损坏。我使用了 x64 和 x86 机器,结果相同。
那么,我该怎么做才能解决它,有什么想法吗?更改分配方法是最不受欢迎的选项,因为要处理的代码太多。