24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1946  |  回复: 9
当前主题已经存档。
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

jhuiuc

至尊木虫 (正式写手)

[交流] 【求助】Fortran里面Stack Overflow【已完成】

Visual Fortran, 程序里面定义了一个整型数组 JS(N), 所有A-H, O-Z参数和数组定义为Real*8类型. 这个数组在Call语句被用到, Call Sub1(A, B, JS).

当N取352以下时, 程序完全正常, 再大就会出现severe 170 -Stack Overflow 的错误信息(Debug时指向这个JS(N)数组).
severe(170): Program Exception - stack overflow
FOR$IOS_PGM_STKOVF. The Compaq Fortran RTL has detected a stack overflow while executing your program. See your Release Notes for information on how to increase stack size.

1. 如何查这个Release Notes?
2. 如何增加Stack Size?
3. 欢迎其他任何相关评论. 如果需要我补充其它信息, 请指出.

程序大概结构是(本身没有任何语言问题, 就是修改N值的时候会出现Overflow现象):
Program Main
Implicit real*8 (A-H, O-Z)
Parameter (N=300)
Integer JS(N)
Real*8 A1(N, N), B1(N,N),X1(N)
......
......
CALL Sub1(A1,B1,N,X1,LL,JS) (A1,B1是2维数组, X1是1维数组, LL是整型数)
......
......
END

SUBROUTINE Sub1(A1,B1,N,X1,LL,JS)
......
......
Return
End

[ Last edited by wangen994 on 2010-1-18 at 12:05 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

magic7004

金虫 (职业作家)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
jhuiuc(金币+10,VIP+0):有可能是在调用子程序Sub1的时候,里面参数都是很大数组, 导致Stack Overflow, 可否解释到底什么是Stack和Heap 1-15 20:51
jhuiuc(金币+5,VIP+0): 1-15 20:52
jhuiuc(金币+10,VIP+0):虽然我写过很多Fortran,但还不知道什么是Heap,能给个例句吗?C语言的也可以 1-16 19:09
貌似楼主有两个N X N维的数组,如果这个是放在stack里的话,那就是非常大的了。
我不清楚FORTRAN的语法,不知道楼主声明数组的方式是不是会把数组放在stack里。
如果是放在stack里的话,建议搂住把数组放到Heap里。

ps:stack就是堆栈,Heap就是堆。每个线程都有自己的stack用来保存局部变量和函数调用信息,根据编译器不同,通常大小1~4MB之间,如果用完了就会出现stack overflow exception。
如果楼主不清楚的话,建议看一下Fortran语法关于内存管理的部分,非常大的数组应该是动态管理的,放在heap里。。

[ Last edited by magic7004 on 2010-1-16 at 16:50 ]
流氓不可怕,可怕的是流氓有文化,有文化又BH的流氓无敌~~!
3楼2010-01-16 16:47:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 10 个回答

magic7004

金虫 (职业作家)

★ ★ ★ ★ ★ ★ ★
余泽成(金币+2,VIP+0):辛苦了! 1-16 16:40
jhuiuc(金币+5,VIP+0):我刚刚修改了原帖,可否给出一些具体意见,另外到底什么是Stack和heap? 谢谢 1-15 20:46
一般默认的stack size是足够的,通常stack overflow 都是某些bug或者很恶劣的算法导致的。
建议搂住修改一下代码,减小stack的使用。比如避免递归调用,避免把很大的结构放在stack里等。建议搂住把大的结构或者数组放在heap里,把递归改成循环。

ps:stack的大小通常是通过调整编译器的参数修改的,这个去找编译器的文档吧。
流氓不可怕,可怕的是流氓有文化,有文化又BH的流氓无敌~~!
2楼2010-01-16 16:38:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

maomao1210

金虫 (正式写手)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
余泽成(金币+2,VIP+0):辛苦了! 1-16 23:13
jhuiuc(金币+88,VIP+0):可否解释一下增加Stack Size对程序会产生什么影响, 比如运行速度降低? 1-16 10:17
引用回帖:
Originally posted by jhuiuc at 2010-1-16 16:25:
Visual Fortran, 程序里面定义了一个整型数组 JS(N), 所有A-H, O-Z参数和数组定义为Real*8类型. 这个数组在Call语句被用到, Call Sub1(A, B, JS).

当N取352以下时, 程序完全正常, 再大就会出现severe 170 -Sta ...

这样修改:stack size
是我从我们群里截的图。答案是某个大侠给出来的。可以参考一下。

[ Last edited by maomao1210 on 2010-1-16 at 19:41 ]
4楼2010-01-16 16:58:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hakekill

木虫 (小有名气)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
余泽成(金币+1,VIP+0):谢谢参与应助! 1-16 23:13
jhuiuc(金币+10,VIP+0):谢谢讨论! 1-16 10:15
这个问题好像有人问过了,我还是推荐使用动态分配数组来做,省心省事
5楼2010-01-16 21:45:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见