回 帖 发 新 帖 刷新版面

主题:紧急求助:fortan动态数组出错。

程序很大  不好多贴出来 大概流程如下。。。 
vv是定义了一个动态数组。。。如下。其中的数据都合理的定义了   不是数据定义的问题
subroutine CONV_YITA()

    integer*4::i,j
...
    real*8,allocatable,dimension(:,:)::vv

...
call conv_schemes_po(i,jbeg+3,jend-3,methody(1,1))
...
return
contains
        subroutine conv_schemes_po(i1,jbeg1,jend1,flag1)
        implicit none

        integer*4::jbeg1,jend1,flag1,i1
        integer*4::m,kk,slbeg,slend,j1
        real*8,dimension(1:4)::alpha

        if(flag1.eq.301)then
            slbeg=-2; slend=2
        elseif(flag1.eq.303)then
            slbeg=-3; slend=3
        elseif(flag1.eq.305)then
            slbeg=-4; slend=4
        elseif(flag1.eq.411)then
            slbeg=-1; slend=2
        elseif(flag1.eq.413)then
            slbeg=0; slend=2
        elseif(flag1.eq.415)then
            slbeg=-2; slend=0
        elseif(flag1.eq.417)then
            slbeg=-2; slend=1
        elseif(flag1.eq.-1)then
            return
        endif
        print*,"before",i1,jbeg1,jend1,flag1,slbeg,slend
        allocate(vv(1:4,slbeg:slend))
        print*,"after",i1,jbeg1,jend1,flag1,slbeg,slend
...
    deallocate(vv)

        return
        endsubroutine
endsubroutine CONV_YITA

结果却是第一行打印可以打出结果  第二个print却打不出结果。
说什么  acess violation................

回复列表 (共13个回复)

沙发

vv哪定义的?

板凳

vv在另一个子程序里定义了。。。。

3 楼

两个不同的子程序定义的变量是不通用的啊。很疑惑你的程序怎么能编译通过呢?

4 楼

对不起   我贴错了   第二个子程序是放在第一个子程序的contains里  我修改好了  麻烦您再看一下

5 楼

建议还是把vv放到module里吧,这样写很容易出问题,子程序里的子程序访问父级空间时很容易出问题。如果没有必要尽量不要用subroutine套subroutine:)

6 楼

您的意思是不是说

我用module   大概思路如下


module ----

各种定义

contians

 subroutine  conv_yita

endsubroutine

subroutine  conv-schemes_po

endsubroutine 

endmodule

7 楼

是的:)

8 楼

试了  还是不行   同样的结果

9 楼

看程序逻辑上没错,怀疑可能有数组越界访问,导致动态数组的头信息被破坏,从而使得一对此数据操作就产生访问错。

10 楼

要熟练使用单步和条件调试定位到某行
具体可以随便划断点,确定有问题的大致区域

我来回复

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