Fortran Coder

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

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

[复制链接]

799

帖子

2

主题

0

精华

大宗师

F 币
3797 元
贡献
2270 点
楼主
发表于 2018-11-26 10:17:45 | 显示全部楼层
1、运行会报错,等号下面的不能输出,角标越界。
2、fortran的指针只能作为一个整体去执行“指向”操作,data_2d(i:i, 1:ncol) => data_1d(1+(i-1)*ncol : (i-1)*ncol+ncol) 这一句的意思是 data_2d的第一个角标上下限都是i,第二个角标1:到4 。重复3次后,最终相当于data_2d(3:3,1:4)这样一个数组。因此第二次输出会导致越界。
[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

    data_2d(1:ncol,1:nrow) => data_1d
    write(*,"(4f6.1)") data_2d
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 *, "===================================="
    write(*,"(4f6.1)")  p_2d

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

本版积分规则

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

GMT+8, 2024-5-8 09:56

Powered by Tencent X3.4

© 2013-2024 Tencent

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