0

我必须处理一些遗留的 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 机器,结果相同。

那么,我该怎么做才能解决它,有什么想法吗?更改分配方法是最不受欢迎的选项,因为要处理的代码太多。

4

1 回答 1

3

这是旧的 FORTRAN,其中内存必须在编译时静态分配。程序员经常只是将数组的起始地址传递给子例程,如array(1). 调用者必须通过声明保留足够的内存。仅当此代码块来自A作为伪参数的过程时,您的示例才有效。并且调用例程或更高级别的声明A足够大,因此NNFULL+1是合法元素。

于 2013-11-13T20:24:51.137 回答