回 帖 发 新 帖 刷新版面

主题:关于数组最大长度的问题

[size=4]    大家好,今天好不容易把输入参数搞好,结果运行的时候出现了数组边界溢出的问题,
(Program Exception - array bounds exceeded),我按Ctrl+F10一行一行的运行,到第1001个数组元素的时候提示我最大长度是1000。我模型数组长度挺长的。请问能不能更改数组允许的最大长度?最大长度和什么参数有关系?如何改?谢谢[/size][em18]

回复列表 (共14个回复)

沙发

不清楚,帮顶一下,路过

板凳

呵呵 谢谢,昨天我有事情 去朋友单位机子上上网,搜到一个我们论坛上的一个类似的帖子,其中有mltx老师的解答,不过走的匆忙,今天想再看下结果找不到那个贴了,好像跟内存有关系吧?有些朋友说也可以调的。具体怎么搞还是不懂,还望各位老师和同学不吝赐教啊

3 楼

另外我用Project => Settings => Link => Category: Output =>Stack allocations
这个方法也不行,我的编译器是CVF6.6

4 楼

Program Exception - array bounds exceeded

这是数组越界啊,你的数组定义的就只有 1000 长度,引用了 1001 就越界了嘛。

你把数组设置得足够自己用的长度就行了,数组的长度是定义的。

跟堆栈无关系,3楼是改堆栈大小。

5 楼

谢谢指导,但是我定义的数组维数是2000+的,论说也不是太大,可就是不行,怎么回事呢??

6 楼

越界不是说你的数组不够大, 而是调用了数组之范围外的内存. 你数组就算是a(1), 但你调用了a(2)照样出现越界的.

7 楼


很不好意思,可能大家误解了,我把一些有关的源程序贴出来:
    READ(5,*)NUMPT
    PRINT*,"输入的固体模型节点总数NUMPT为:",NUMPT   (输入的是1446)
      .....
         DIMENSION P(NUMPT),DP(NUMPT),DP1(NUMPT)  
      .....
初始化:
         DO I=1,NUMPT
    P(I)=0.0
    DP(I)=0.0
    DP1(I)=0.0
         ENDDO
         就是这个循环,我检查出来是这样的:
        Name             Value
    ......
        DP1(1000)        0.00000000e+000
        DP1(1001)        Array expansion limited to 1000 nodes
我想这1446个点不算多吧,怎么系统就不认呢?请各位老师指教。

8 楼

你可以把 输入 NUMPT 放在 DIMENSION 语句前面吗??这是什么编译器??

输入语句(Read)是执行语句,它必须放在变量定义的后面才对。

9 楼

Array expansion limited to 1000 nodes
似乎不是编译器告诉你的, 是程序设计的时候作者加上去的吧? 编译器怎么知道你这个数据的对应的是nodes呢?

10 楼


刚才我另外编了一个小的程序,里面定义1200维的数组就可以 而在出现问题的程序里只要是维数多过1000的 到1001都不行。是不是我的定义方法错了?再麻烦老师帮我看下吧
      PROGRAM FSII
      IMPLICIT REAL*8(A-H,O-Z),INTEGER(I-N)
      ALLOCATABLE::IELEM(:,:),VMATI(:),VCOOD(:,:),
     $IFIXD(:,:),VFIXD(:,:),ILOAD(:,:),VLOAD(:,:)
    ALLOCATABLE::GMD(:,:),GLD(:,:),GKD(:,:),
     $GMF(:,:),GLF(:,:),GKF(:,:),GG(:,:)
    ALLOCATABLE::VMD(:,:),VLD(:,:),VKD(:,:),
     $VMF(:,:),VLF(:,:),VKF(:,:),VGG(:,:)    
    ALLOCATABLE::V(:),P(:),VGRID(:)
    ALLOCATABLE::DS(:),VS(:),AS(:)
      COMMON/COM1/MND,NUMEL,NUMPT,NF
    COMMON/COM2/MND2,NUMPT2,N
    COMMON/COM3/GRAV,NPC
    COMMON/STUC/H,RAD,APM
    COMMON/ELEM/NODE,INTX,INTY,NFIX
    COMMON/DYN/OMEGA,TT,DT,ALPHA,DELTA,GAMA
      OPEN(5,  FILE ='IN_DAT', STATUS= 'UNKNOWN' )
C     IN_DAT.DAT-输入文件;
      OPEN(6,  FILE= 'OUT_DAT', STATUS= 'UNKNOWN')
C     OUT_DAT-输出所有输入文件;
    READ(5,*)MND
    PRINT*,"输入固体模型的单元节点数MND为:",MND
    READ(5,*)NUMEL
    PRINT*,"输入的固体模型单元总数NUMEL为:",NUMEL
    READ(5,*)NUMPT
    PRINT*,"输入的固体模型节点总数NUMPT为:",NUMPT   
    READ(5,*)NF
    PRINT*,"输入的节点速度自由度数NF为:",NF
    READ(5,*)NFIX
    PRINT*,"输入的有速度约束的节点值NFIX为:",NFIX 
    READ(5,*)NPC
    PRINT*,"输入流体向固体传递压力节点NPC为:",NPC
    READ(5,*)OMEGA
    PRINT*,"载荷角频率OMEGA为:",OMEGA
    READ(5,*)TT
    PRINT*,"响应总时间TT为:",TT
    READ(5,*)DT
    PRINT*,"子部时间DT为:",DT
    READ(5,*)ALPHA
    PRINT*,"参数ALPHA为:",ALPHA
    READ(5,*)DELTA
    PRINT*,"参数DELTA为:",DELTA
    READ(5,*)GAMA
    PRINT*,"参数GAMA为:",GAMA
    READ(5,*)H
    PRINT*,"悬浮物的高度H为:",H
    READ(5,*)RAD
    PRINT*,"悬浮物的半径RAD为:",RAD
    READ(5,*)APM
    PRINT*,"振动板的位移幅值为APM为:",APM
    MND2=NF*MND
    NUMPT2=NF*NUMPT
      N=TT/DT
      ALLOCATE(IELEM(NUMEL,3+MND),VMATI(3),VCOOD(NUMPT,2),
     $IFIXD(NFIX,NF+1),VFIXD(NFIX,NF),ILOAD(NPC,NF+1),VLOAD(NPC,NF))
    ALLOCATE(GMD(NUMPT,NUMPT),GLD(NUMPT,NUMPT),GKD(NUMPT,NUMPT2),
     $GMF(NUMPT2,NUMPT2),GLF(NUMPT2,NUMPT2),GKF(NUMPT2,NUMPT2),
     $GG(NUMPT2,NUMPT))
    ALLOCATE(VMD(MND,MND),VLD(MND,MND),VKD(MND,MND2),
     $VMF(MND2,MND2),VLF(MND2,MND2),VKF(MND2,MND2),VGG(MND2,MND))
    ALLOCATE(V(NUMPT2),P(NUMPT),VGRID(NUMPT2))
      ALLOCATE(DS(N+1),VS(N+1),AS(N+1))
      CALL INPUT(IELEM,VMATI,VCOOD,VGRID,DS,VS,AS,V,P)

我来回复

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