【发布时间】:2014-10-09 15:39:30
【问题描述】:
当我尝试运行一个巨大的 Fortran 代码(代码使用 Intel 编译器版本 13.1.3.192 编译)时,它给了我这样的错误消息:
...
Info[FDFI_Setup]: HPDF code version number is 1.00246
forrtl: severe (153): allocatable array or pointer is not allocated
Image PC Routine Line Source
arts 0000000002AD96BE Unknown Unknown Unknown
arts 0000000002AD8156 Unknown Unknown Unknown
arts 0000000002A87532 Unknown Unknown Unknown
...
尽管如此,如果我在下面的一个子例程中插入一个小的写语句(这只是为了检查代码,而不是干扰代码的原始用途)(我不能把所有的代码,因为他们太大了):
...
endif
call GetInputLine(Unit,line,eof,err)
enddo
if(err) return
! - [elfsummer] 20140815 Checkpoint 23
open(unit = 1, file = '/bin/monitor/log_checkpoint',status='old',position='append')
write(1,*) "BEFORE checking required keys: so far so good!"
close(1)
! check required keys
! for modes = 2,3, P and T are the required keys
if(StrmDat%ModeCI==2.or.StrmDat%ModeCI==3) then
...
然后突然,上面显示的错误信息消失了,代码可以正常运行了!我也尝试在源代码的其他位置插入这样的写语句,但上面的错误信息仍然存在。
严重(153):未分配可分配数组或指针 美元 IOS_INVDEALLOC。 Fortran 90 可分配数组或指针在您尝试解除分配时必须已分配。您必须先分配数组或指针,然后才能再次释放它。 注意:此错误可以由 STAT 在 DEALLOCATE 语句中返回。
但是,我看不到错误与我添加到代码中的“写语句”之间的任何关系。在我添加写语句的位置没有这样的“分配”命令。
所以我很困惑。有人知道原因吗?非常感谢任何帮助!
使用回溯选项,我可以直接定位错误源:
subroutine StringRead(Str,delimiter,StrArray,ns) ! [private] read strings separated by delimiter
implicit none
character*(*),intent(in) :: Str
character*(*),intent(in) :: delimiter
character*(*),pointer :: StrArray(:)
integer,intent(out) :: ns
! - local variables
character(len=len(Str)) :: tline
integer :: nvalue,nvalue_max
character(len=len(StrArray)),pointer:: sarray(:),sarray_bak(:)
integer :: len_a,len_d,i
! deallocate StrArray
if(associated(StrArray)) deallocate(StrArray)
根据回溯给我的信息,错误在于上面显示的最后一条语句。如果我注释掉这个语句,那么“forrtl:严重(153)”错误会在生成新错误时消失......但是,我仍然认为这个语句本身不会出错......它就像它一样只是忽略 if... 条件并直接读取 deallocate 指令,这对我来说似乎很奇怪。
【问题讨论】:
-
“但是,我看不到错误与我添加到代码中的“写语句”之间有任何关系。” 正如其他人指出的那样,确实没有这两者之间的关系。无论如何,应该帮助您确定错误发生的位置是将
-traceback标志添加到您的编译器选项中。然后您应该能够立即知道您正在释放的变量尚未分配。然后你应该找到它应该被分配的地方,并确定为什么没有分配(也请参阅 Ettiene 的评论)。 -
可能
StrArray的关联状态未定义? -
稍微放大@francescalus 的评论——这是 Fortran 指针的一个特性,当它们第一次声明(没有初始化)时,它们既不是
associated,也不是disassociated,而是undefined。将未定义的指针传递给associated内在函数会产生未定义的行为。 -
那我怎样才能避免这种说法但仍然保持它的意思呢? =)
-
为了避免未定义的指针在声明时初始化(可能是
=> null())。或者全力以赴,避免使用指针并使用可分配数组——这可能会将我们带入一个新问题,而不是 cmets 中的这种闲聊。
标签: fortran intel-fortran