zoukankan      html  css  js  c++  java
  • fortran出现stack overflow的原因及解决办法

    有两个type类型的数组A和B,大小均为N,N可能几十万大小。

    当使用如下赋值方法时,提示stack overflow

    A=B

    当该成DO循环赋值时,就正常通过

    do i=1,N

    A(i)=B(i)

    end do

    网上找不到具体的原因,相关的问题整理如下:

    http://emuch.net/html/201001/1800067.html

    http://tieba.baidu.com/p/691353242

    http://tieba.baidu.com/p/691353242

    (1)整体赋值时都要放到stack里面,当循环赋值时则一个一个进入stack,不会出现溢出。

    (2)貌似楼主有两个N X N维的数组,如果这个是放在stack里的话,那就是非常大的了。

    我不清楚FORTRAN的语法,不知道楼主声明数组的方式是不是会把数组放在stack里。

    如果是放在stack里的话,建议搂住把数组放到Heap里。

    ps:stack就是堆栈,Heap就是堆。每个线程都有自己的stack用来保存局部变量和函数调用信息,根据编译器不同,通常大小1~4MB

    之间,如果用完了就会出现stack overflow exception。 

    如果楼主不清楚的话,建议看一下Fortran语法关于内存管理的部分,非常大的数组应该是动态管理的,放在heap里。

    (3)我同事原来也遇到过类似的问题,后来把project设置里的堆栈加大就可以了,默认是1M,你可以加大到10M试试. 

    project-> setting-> link: 

    在category里选择output,在stack的Reserve里输入0x10000000试试

    (4)二楼没说原因。一般来说,全局变量和静态变量在数据段,大小几乎没有限制,也就是跟系统能访问的内存大小相符。局部变

    量在栈区,但是大小有限制,跟编译器设置有关。动态分配内存在堆区,大小跟全局变量的一样。

    所以楼主的程序局部变量使用过多,导致栈溢出。这么大肯定溢出,这个变量在主程序和子程序中都是局部变量,只有放在程序之外

    声明才是全局变量,或者用动态分配。

    (5)Fortran程序中报错stack overflow: 

    一般Fortran编译器默认情况是allocatable array放在堆里, Automatic Array放在栈里. 栈的缺省设置一般为1048576 Byte = 1MB. 

    数组越界, 在Visual Fortran里提示stack overflow. 在Fortran77这样的UNIX平台下的编译器里通常是core dump. 这时把栈的缺省

    设置改大即可. 

    办法:(VISUAL FORTRAN里建立的该程序的WORKSPACE窗口内) 

    MAIN MENU: Project ===> Setting ===> Link ===> Category : Output ===> Stack Allocations ===> Reserve : (栈大小) 

        1MB:    1048576 Byte 

       10MB:   10485760 Byte 

       64MB:   67108864 Byte 

    100MB:  104857600 Byte 

    128MB:  134217728 Byte 

    256MB:  268435456 Byte (MAX)


  • 相关阅读:
    AngularJS中实现无限级联动菜单
    理解AngularJS生命周期:利用ng-repeat动态解析自定义directive
    denounce函数:Javascript中如何应对高频触发事件
    Javascript中的循环变量声明,到底应该放在哪儿?
    优雅的数组降维——Javascript中apply方法的妙用
    如何利⽤360Quake挖掘某授权⼚商边缘站点漏洞
    Java课程设计--网络聊天室
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
  • 原文地址:https://www.cnblogs.com/ljy339/p/7507107.html
Copyright © 2011-2022 走看看