回 帖 发 新 帖 刷新版面

主题:主程序和子程序参数传递问题

program main
real,allocatable:: a(:,:)
allocate a(405,405)
....
call test(a)
end program

subroutine test(a)
real:: a(405,405)
....
end subroutine

我用的是CVF6.6,我的代码大体上是上面的格式,其中a是输出参数,但call test的时候就中断了,似乎是说内存空间的问题,然后改为下边代码:
program main
real,allocatable:: a(:,:)
allocate a(405,405)
....
call test(a)
end program

subroutine test(a)
real,allocatable:: a(:,:)
allocate a(405,405)
....
end subroutine
编译时报warning:
Warning: In the call to STIFF_WHOLE, actual argument does not match the type and kind of the corresponding dummy argument.
可以执行,但在子程序算的a是正确的,但主程序传出来的参数就错误了,似乎主程序的a值是胡乱初始化的,和test子程序的a值一点关系没有。

这个问题折磨我好几天了,一直无法解决,求大家帮助,谢谢了。

回复列表 (共6个回复)

沙发

还有一点,我第一中格式,405 X 405的 矩阵也不算大啊,虽然有5-6个这样的数组, 怎么就提示内存不足之类的了?
在第二中格式中,是不是主程序中对a进行了allocate,然后调运子程序有对a进行了allocate, 这是不是会出错啊?

板凳

你在主程序中分配了就不应在到子程序里分配。
建议你把这个数组整到Module里吧。

3 楼

cvf确实不支持子程序对可变数组进行操作.
至于你第一种情况, 为什么说内存不足, 要么帖详细错误提示; 要么代码不长就完整贴出.

4 楼

我的代码比较长700多行,贴不出来,是在执行的时候出错的,说是stack overflow

5 楼

Module DataCenter
    Real,Allocatable,Save::    a(:,:)
End Module

Program
    Use DataCenter

    Allocate(a(405,405))
    ...
    Call Test()
    Deallocate(a)
End Program

Subroutine Test()
    Use DataCenter

    ...
End Subroutine

6 楼

stack overflow 你站内搜索一下或者google一下就找到解决方法了. 这是堆栈不足.可以设置.
或者参考cgl_lgs的方法修改.

我来回复

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