Fortran Coder

查看: 6750|回复: 3
打印 上一主题 下一主题

[指针] 关于指针数组传递数值的问题

[复制链接]

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
跳转到指定楼层
楼主
发表于 2019-12-12 01:23:00 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
我今天写了一个关于矩阵展开的函数,作用是将四维数组沿每个维度展成二维矩阵,调用展开函数的时候发现了问题,我声明的指针数组在指向子函数中生成的二维矩阵时,数组每行最后两个值丢失,变成了极小数。是我指针传递过程中地址出现了问题嘛,请各位老师指教。附代码如下:program main    implicit none
!声明接口
    interface
    subroutine PMF_unfold(A,ncmpx,ncmpy,nhx,nhy,f,B)
    integer::icmpx,icmpy,ihx,ihy,m,n,f
    integer::ncmpx,ncmpy,nhx,nhy
    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
    integer::icmpx,icmpy,ihx,ihy,f
    real*4,allocatable::A1(:,:,:,:),A2(:,:,:,:)
    real*4,allocatable,target::B1(:,:),B2(:,:),B3(:,:),B4(:,:)
    real*4,pointer::B(:,:)
    integer::ncmpx,ncmpy,nhx,nhy
    ncmpx=3
    ncmpy=4
    nhx=5
    nhy=6
    allocate(A1(ncmpx,ncmpy,nhx,nhy))
    allocate(A2(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 ihy=1,nhy
        do ihx=1,nhx
            do icmpy=1,ncmpy
                do icmpx=1,ncmpx
                    A1(icmpx,icmpy,ihx,ihy)=icmpx+(icmpy-1)*ncmpx+(ihx-1)*ncmpx*ncmpy+(ihy-1)*nhx*ncmpx*ncmpy+1000     
                end do
            end do
        end do
    end do
    f=4
!调用展开函数
    call PMF_unfold(A1,ncmpx,ncmpy,nhx,nhy,f,B)
   write(*,*)B(3,:)输出指针B
    deallocate(B1,B2,B3,B4)
    deallocate(A1,A2)
    pause
    end program

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine PMF_unfold(A,ncmpx,ncmpy,nhx,nhy,f,B)
    implicit none
    integer::icmpx,icmpy,ihx,ihy,m,n,f
    integer::ncmpx,ncmpy,nhx,nhy
    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)
  if(f==4)then!当F等于四时
        do ihy=1,nhy
            do ihx=1,nhx
                do icmpy=1,ncmpy
                    do icmpx=1,ncmpx
                        m=ihy
                        n=(ihx-1)*ncmpy*ncmpx+(icmpy-1)*ncmpx+icmpx
                        B4(m,n)=A(icmpx,icmpy,ihx,ihy)     
                    end do
                end do
            end do
        end do
             B=>B4(:,:)
                end if

    end subroutine




分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

地板
发表于 2019-12-13 07:55:08 | 只看该作者
紫雪封尘 发表于 2019-12-12 10:33
请问,我B4 实在主函数中allocate分配的内存空间,他在子函数结束之后也会被释放嘛 ...

不会。只有子程序声明的数组在子程序返回后消失,传递进来的数组不会消失。

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
板凳
 楼主| 发表于 2019-12-12 10:33:31 | 只看该作者
necrohan 发表于 2019-12-12 10:14
这个问题发的帖子重复了,http://bbs.fcode.cn/forum.php?mod=viewthread&tid=2160
但是这里代码比另一个帖 ...

请问,我B4 实在主函数中allocate分配的内存空间,他在子函数结束之后也会被释放嘛

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

沙发
发表于 2019-12-12 10:14:03 | 只看该作者
这个问题发的帖子重复了,http://bbs.fcode.cn/forum.php?mod=viewthread&tid=2160
但是这里代码比另一个帖子完整,起码可以编译通过。
问题是一样的,B4在子程序结束后就释放了,指针B就没有意义了,在参数里多传一个数组作为指针指向的地址吧。
也可能截取的程序有问题。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-25 22:25

Powered by Tencent X3.4

© 2013-2024 Tencent

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