|
板凳
楼主 |
发表于 2015-9-9 10:58:02
|
只看该作者
黑框提示
program exception—Access violation
然后给了几个调用的位置,最初的位置就是出问题的subroutine的end subroutine处,其他的按照调用的“后、先”顺序给的调用处的位置。
奇怪的地方是,逐步运行一直是到这个子程序运行完毕,得到正确结果后,到end subroutine的时候才出错的。检查过多遍,没有“未分配的数组传递到函数中,函数中也未分配就直接使用”的问题,不然也出不了结果。
我猜测问题应该来自可变长度数组和指针的分配。
可疑点一:可变长度数组。在这个subroutine中循环调用了一个来自DLL的子程序,这个被调用的子程序有一个输出参数是可变长度数组,这个数组在被调用子程序内部分配,获取的值供调用子程序使用。
调用子程序用完后没有释放,因为释放会出问题。(之前群主说过这是一个不好的做法,不遵循“谁分配谁释放”,但是我当前的工作这么处理会方便很多,切不释放就不会有问题,各处就一直还是这么用的)。
窃以为问题由此疑点导致的可能性较低。
可疑点二:这个subroutine中用了指针,但是我一直也是这么用的,也没出过问题,大概是这么个过程:
type(pl), pointer :: pP,hP
......
allocate( hP )
pP=>hP
nullify(hP%next)
do j=1,icount
pP%i= iarray(j)
allocate( pP%next )
pP=>pP%next
enddo
pP=>hP
do i=1,icount
iarray1(i) = pP%i
if ( .not. associated(pP%next) ) exit
pP=>pP%next
enddo
pP=>hP
do i=1,icount+1
deallocate(pP)
enddo
还请再给把把脉啊! |
|