回 帖 发 新 帖 刷新版面

主题:求救:还是stack overflow 问题;上面方法解决不了啊!!

要传入子程序的数组比较大
而且在主程序中维数和里面的值都是随时间变化的,每一步时间都要调用子程序,
结构大致如下
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个回复)

沙发

建议使用动态数组,你需要使用全局变量的话,建议写入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

板凳

是不是使用allocate声明的数组在调用子程序不会进栈,所有就不会出现stack overflow?

3 楼

allocate等同于new方式,都是堆上的操作,但是必须由程序员来控制消亡。
堆和栈增长方向不一样,堆向上增长,栈向下增长,所以堆的限度和你内存空间有关,栈必定是有限的。

4 楼

[quote]allocate等同于new方式,都是堆上的操作,但是必须由程序员来控制消亡。
堆和栈增长方向不一样,堆向上增长,栈向下增长,所以堆的限度和你内存空间有关,栈必定是有限的。[/quote]

谢谢董兄解答,我对堆栈不怎么了解,但是编程中经常碰到这类问题,请问有没有相关的资料讲解的比较详细易懂的?

5 楼

我不知道有没有哪本书讲的系统些,各类编程书中都会提到,但都会很零碎。
Google关键词搜索程序的内存分配,可以作为了解,已经可以应付一般的问题(只对fortran来说)。
CSDN上这个问题问的也很多,已经可以匹敌i+++++i+i++的日经帖了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册