Fortran Coder

查看: 9461|回复: 6
打印 上一主题 下一主题

[子程序] 子函数中被赋值的指针传递到主函数中丢失

[复制链接]

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

楼主
发表于 2019-12-12 10:01:15 | 显示全部楼层
你这个程序片段截取的乱七八糟的,很多变量都没用。
使用指针作为参数,必须有显式接口。我简化了一下举个例子
[Fortran] 纯文本查看 复制代码
implicit none
! 接口
interface
  subroutine PMF_unfold(B,B4)
  real*4,pointer::B(:,:)
  real*4,target::B4(6,2)
  end subroutine PMF_unfold
end interface
real*4,pointer::B(:,:)
real*4,target::B4(6,2)

call PMF_unfold(B,B4)
write(*,*)B(5,:)
end program
!-----------------------------
subroutine PMF_unfold(B,B4)
  implicit none
  real*4,pointer::B(:,:)
  real*4,target::B4(6,2)
  B4=1
  B=>B4 ! (:,:)
end subroutine PMF_unfold

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

沙发
发表于 2019-12-13 08:40:31 | 显示全部楼层
子程序中声明的数组是只能在子程序内使用的,在子程序返回后就没有意义了,返回的指针指向的数组那块内存仍然存在,但是里面的数据随时可能修改,因此返回的指针是不可靠的。下面这个例子你看下
[Fortran] 纯文本查看 复制代码
program main
implicit none
interface
  subroutine PMF_unfold(A,ncmpx,ncmpy,nhx,nhy,f,B,B1,B2,B3,B4)
  integer::ncmpx,ncmpy,nhx,nhy,f
  real*4::A(ncmpx,ncmpy,nhx,nhy)
  real*4,pointer::B(:,:)
  real*4,target::B1(ncmpx,ncmpy*nhx*nhy),B2(ncmpy,ncmpx*nhx*nhy),B3(nhx,ncmpx*ncmpy*nhy),B4(nhy,ncmpx*ncmpy*nhx)
  end subroutine
end interface
!主函数
real*4,allocatable::A1(:,:,:,:)
real*4,allocatable,target::B1(:,:),B2(:,:),B3(:,:),B4(:,:)
real*4,pointer::B(:,:)
integer::ncmpx,ncmpy,nhx,nhy,f

ncmpx=3; ncmpy=4; nhx=5; nhy=6;
allocate(A1(ncmpx,ncmpy,nhx,nhy))
allocate(B1(ncmpx,ncmpy*nhx*nhy),B2(ncmpy,ncmpx*nhx*nhy),B3(nhx,ncmpx*ncmpy*nhy),B4(nhy,ncmpx*ncmpy*nhx))

!调用函数
do f=1,4
  call PMF_unfold(A1,ncmpx,ncmpy,nhx,nhy,f,B,B1,B2,B3,B4)
  write(*,'(10f4.1)')B
  write(*,*)
enddo
deallocate(A1,B1,B2,B3,B4)
end ! program main
!---------------------------------------
!子函数
subroutine PMF_unfold(A,ncmpx,ncmpy,nhx,nhy,f,B,B1,B2,B3,B4)
implicit none
integer::ncmpx,ncmpy,nhx,nhy,f
real*4::A(ncmpx,ncmpy,nhx,nhy)
real*4,pointer::B(:,:)
real*4,target::B1(ncmpx,ncmpy*nhx*nhy),B2(ncmpy,ncmpx*nhx*nhy),B3(nhx,ncmpx*ncmpy*nhy),B4(nhy,ncmpx*ncmpy*nhx)
B1=1; B2=2; B3=3; B4=4; ! 测试数据
if(f==1)then
  B=>B1(:,:)
elseif(f==2)then
  B=>B2(:,:)
elseif(f==3)then
  B=>B3(:,:)
elseif(f==4)then
  B=>B4(:,:)
end if
end ! subroutine

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-16 16:28

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表