主题:求救:还是stack overflow 问题;上面方法解决不了啊!!
ccc1979
[专家分:0] 发布于 2011-06-01 20:19:00
要传入子程序的数组比较大
而且在主程序中维数和里面的值都是随时间变化的,每一步时间都要调用子程序,
结构大致如下
grograme
real dimension(:,:,:,:)::a
do t=1,n
.......i
.......j
.......
k
l
a(i,j,k,l)
.......
call zichenxu(a)
end do !t
end programe
当数组a形成后,去调用子程序当数组稍大就会有:stack overflow
求救于高手专家!!不胜感激;qq :5882450 在线等
回复列表 (共5个回复)
沙发
aliouying [专家分:1150] 发布于 2011-06-01 21:09:00
建议使用动态数组,你需要使用全局变量的话,建议写入module,基本格式如下:
module mod_name
implicit none
real, allocatable :: a(:,:,:,:)
end module
program main
use mod_name
implicit none
allocate(a(n1,n2,n3,n4))
call your_sub()
stop
end program main
subroutine your_sub()
use mod_name
implicit none
a = 1
return
end subroutine your_sub
板凳
bshine1225 [专家分:720] 发布于 2011-06-10 14:16:00
是不是使用allocate声明的数组在调用子程序不会进栈,所有就不会出现stack overflow?
3 楼
dongyuanxun [专家分:7180] 发布于 2011-06-10 14:34:00
allocate等同于new方式,都是堆上的操作,但是必须由程序员来控制消亡。
堆和栈增长方向不一样,堆向上增长,栈向下增长,所以堆的限度和你内存空间有关,栈必定是有限的。
4 楼
bshine1225 [专家分:720] 发布于 2011-06-10 14:46:00
[quote]allocate等同于new方式,都是堆上的操作,但是必须由程序员来控制消亡。
堆和栈增长方向不一样,堆向上增长,栈向下增长,所以堆的限度和你内存空间有关,栈必定是有限的。[/quote]
谢谢董兄解答,我对堆栈不怎么了解,但是编程中经常碰到这类问题,请问有没有相关的资料讲解的比较详细易懂的?
5 楼
dongyuanxun [专家分:7180] 发布于 2011-06-10 15:11:00
我不知道有没有哪本书讲的系统些,各类编程书中都会提到,但都会很零碎。
Google关键词搜索程序的内存分配,可以作为了解,已经可以应付一般的问题(只对fortran来说)。
CSDN上这个问题问的也很多,已经可以匹敌i+++++i+i++的日经帖了。
我来回复