我在使用一些现有的 FORTRAN 代码时发现了一个问题。尽管它已经预料到需要在重新分配之前释放数组,但这从来没有必要。我现在需要它来执行此操作,但它无法正常工作。
目前的伪代码大概是:
MODULE mA
TYPE A
REAL, DIMENSION(:,:,:), ALLOCATABLE :: array
END TYPE
TYPE (A), POINTER :: sw(:)
END MODULE
后来,有分配“数组”大小的代码,我现在调用了两次(迄今为止只有一次):
...
IF (ALLOCATED(sw(1)%array)) DEALLOCATE(sw(1)%array, STAT=aviFail)
IF (aviFail.EQ.0) ALLOCATE(sw(1)%array(1,2,3), STAT=aviFail)
...
我查看了 ALLOCATE、DEALLOCATE 和 ALLOCATED 的定义,发现如下:
- 在第二次通过时,调用 DEALLOCATE,但 STAT 值为 '1'
- 在失败的情况下(即一个积极的 STAT 返回),DEALLOCATE 意味着保持原始数组不变。它没有:它显然正确地清除了它(至少,根据调试器)。
- 在失败且未定义 STAT 的情况下,DEALLOCATE 意味着终止程序。它没有,但以下 ALLOCATE 语句失败,STAT 值为“1”。
我还无意中在其他地方两次调用了同一个数组上的 ALLOCATE,而没有先 DEALLOCATING。根据这本书,这应该会导致程序终止。它不仅可以工作,而且可以正常工作,并且第二个 ALLOCATE 的 STAT 返回为“0”。
英特尔 FORTRAN 是否以不同的方式处理这些事情,或者 FORTRAN 在满足其规范方面不像 C++ 那样挑剔?