lmy8508 发表于 2013-9-1 16:17:03

子程序与主程序动态数组问题

本帖最后由 lmy8508 于 2013-9-1 16:18 编辑

各位大牛,本人刚学FORTRAN,编写了如下代码:
!!!!!!!!!!!!!!!!!!!
program main
implicit none

real(kind=8),allocatable :: pp(: )
integer ii
call sys(ii)
allocate(pp(ii))

call sp(pp)

write(*,*) pp

stop

pause

end
!!!!!!!!!!!!!!!!!!!
subroutine sp(pp)
implicit none

integer ii
real(kind=8),allocatable :: pp(: )

call sys(ii)
allocate(pp(ii))

pp(: )=1.0D0
end
!!!!!!!!!!!!!!!!
subroutine sys(iii)
implicit none
integer iii
iii=6
end
!!!!!!!!!!!!
程序编译没有错误,但是主程序输出的PP值怎么不是子程序赋值的1.0.而是一些其他的数值。请问上述代码哪里有问题。
另:主要想实现功能为,主程序main和子程序sp中变量PP维数均是运算调用子程序sys才能确定,所以运用了动态数组命令allocatable。如果要实现这个功能,请问该如何编写主程序和子程序。

tutu08 发表于 2013-9-2 10:59:59

本帖最后由 tutu08 于 2013-9-2 11:03 编辑

main 中 已经 allocate(pp(ii)) 了,PP就已经定下来了,进入子程序sp后,对PP又进行了二次申请,这样操作不符合逻辑,没有任何道理可言。
假定在main中 pp进行了初始化赋值,就应该在后续过程中传递并使用,而不会进入子程序再进行申请,否则原始的数据就丢失了;
你这样操作,似乎与C中 **PP的二维动态数组类似,但你在fortran中声名确是一维的,二维数组也不是这么申请的,编译就不该通过才对。

1、建议在 subroutine sp(pp)
implicit none
integer ii
real(kind=8),allocatable,intent(in) :: pp(: )
增加INTENT(IN)属性;

2、用两个数组实现你的需求,然后进行相互赋值操作即可。
页: [1]
查看完整版本: 子程序与主程序动态数组问题