我必须处理一些遗留的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机器,结果相同。
那么,我应该怎么做才能解决它,任何想法?更改分配方法是最不受欢迎的选项,因为有太多代码需要处理。
答案 0 :(得分:3)
这是旧的FORTRAN,在编译时必须静态分配内存。程序员经常将数组的起始地址传递给子程序,如array(1)
。调用者必须通过声明保留足够的内存。只有当此代码块来自A
为伪参数的过程时,您的示例才有效。调用例程或更高版本声明A
足够大,N
和NFULL+1
是合法元素。