动态数组在Fortran中被破坏

时间:2013-11-13 16:40:28

标签: arrays memory-management fortran fortran77

我必须处理一些遗留的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!
      ....

调试并不容易,因为我有这样的手表: enter image description here

或者像这样 enter image description here

该程序是在几年前建立的,它正在运行,但重建版本已被破坏。我使用x64和x86机器,结果相同。

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

1 个答案:

答案 0 :(得分:3)

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