Fortran Coder

楼主: andy8496
打印 上一主题 下一主题

[调试器] Debug才有的问题

[复制链接]

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
5#
 楼主| 发表于 2015-9-9 14:07:30 | 只看该作者
都是fortran写的,调用应该也没有问题,因为被调用的子程序在别的子程序中也是这么调用的。
刚百度了下这个堆栈失衡,确有可能(①Release没问题②程序尾)。没有“谁分配谁释放”会导致堆栈失衡吗?

我也想“谁分配谁释放”。但是有时候感觉很不方便。比如,要读取一个文件,实现也不知道里面有多少数据,只能给“派”去读文件的子程序一个虚数组,在这个子程序读的时候在他内部分配。如果要把这个此程序放到DLL中,就不能“谁分配谁释放了”。在么就是先读一遍,统计下数据量,然后分配,然后读一遍。但是对于结构复杂,要进行比较复杂解析的文件,效率就下去了。

如果是堆栈失衡,除了"谁分配谁释放",还有别的招吗?

顺便再问个问题,我上面那种指针用完了释放改如何操作?

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
608 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2015-9-9 12:10:51 | 只看该作者
在子程序结束处出错,极大可能是堆栈失衡。
可以考虑 DLL 的调用是否合理?调用协定是否一致?DLL 和 exe 是否都是 Fortran 书写?

非常建议你:谁分配谁释放。这非常重要。尤其是较大的程序。

123

帖子

32

主题

0

精华

宗师

F 币
1562 元
贡献
795 点
板凳
 楼主| 发表于 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

还请再给把把脉啊!

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
608 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2015-9-9 08:34:44 | 只看该作者
看黑框的错误提示
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-20 12:31

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表