Fortran Coder

查看: 6913|回复: 4
打印 上一主题 下一主题

[指针] 数组指针参数在返回时为什么改变了指向的数据?

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
19 元
贡献
9 点
跳转到指定楼层
楼主
发表于 2018-11-24 00:20:57 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
一个过程的一个参数是一个数组指针。
这个指针在过程内被正确赋值,可通过PRINT打印语句证明。但当过程调用结束后,它的值就变化了,实在不明所以,请大神指教。
下面是完整的、可编译的代码:
[Fortran] 纯文本查看 复制代码
SUBROUTINE BIANXING(data_2d, data_1d, nrow, ncol)
    implicit none
    REAL, DIMENSION(:,:), POINTER, INTENT(INOUT) :: data_2d
    REAL, DIMENSION(:), POINTER, INTENT(IN) :: data_1d
    INTEGER, INTENT(IN) :: nrow
    INTEGER, INTENT(IN) :: ncol

    INTEGER i
    DO i=1, nrow
!        PRINT *, "i=", i, 1+(i-1)*ncol, i*ncol 
        data_2d(i:i, 1:ncol) => data_1d(1+(i-1)*ncol : (i-1)*ncol+ncol)
    PRINT *, data_2d(i:i, 1:ncol)
    END DO
END SUBROUTINE BIANXING

PROGRAM MAIN
    implicit none
    INTERFACE
SUBROUTINE BIANXING(data_2d, data_1d, nrow, ncol)
    implicit none
    REAL, DIMENSION(:,:), POINTER, INTENT(INOUT) :: data_2d
    REAL, DIMENSION(:), POINTER, INTENT(IN) :: data_1d
    INTEGER, INTENT(IN) :: nrow
    INTEGER, INTENT(IN) :: ncol
END SUBROUTINE BIANXING
    END INTERFACE

    REAL, DIMENSION(12), TARGET :: arr
    REAL, DIMENSION(:), POINTER :: p_1d
    REAL, DIMENSION(:, :), POINTER :: p_2d
    INTEGER :: i
    arr = (/1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12/)
    p_1d => arr
    
    call BIANXING(p_2d, p_1d, 3, 4)

    PRINT *, "===================================="
    DO i=1, 3
        PRINT *, p_2d(i, 1:4)
    END DO
END PROGRAM MAIN

屏幕显示的结果是:
   1.00000000       2.00000000       3.00000000       4.00000000   
   5.00000000       6.00000000       7.00000000       8.00000000   
   9.00000000       10.0000000       11.0000000       12.0000000   
====================================
   7.00000000       8.00000000       9.00000000       10.0000000   
   8.00000000       9.00000000       10.0000000       11.0000000   
   9.00000000       10.0000000       11.0000000       12.0000000   

那一连串等号上面的数字是在过程内部打印出来的,下面是在调用过程之后打印出来了。我期待的结果应该两者相同啊。请问问题出在哪里?
多谢!


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

2

帖子

1

主题

0

精华

新人

F 币
19 元
贡献
9 点
沙发
 楼主| 发表于 2018-11-27 16:08:19 | 显示全部楼层
非常感谢 vvt 和 li913! 我是从c和python转过来的,非常不适应Fortran的指针。熬夜学习了还是不能改变原来的惯性思维,多谢两位的点拨!
总结一下我的错误:
1. 误以为 dimension(:,:), pointer 声明的是由指针组成的数组。Fortran根本没有指针数组,只有可以指向数组的单个指针。
2. 指向数组的指针在赋值时确实只能作为一个整体进行赋值。(引用时可以指定下标,因为Fortran的指针就是目标的别名嘛。这是另一回事了。)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-7 23:40

Powered by Tencent X3.4

© 2013-2024 Tencent

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