Fortran使用指针重映射打印矩阵对角线遇数据声明报错求解
报错根源
unexpected data declaration statement 这类报错的核心触发原因是Fortran的语法规则:所有变量、指针的类型声明语句,必须放在程序单元的最开头位置,所有可执行语句之前。
你当前的代码里,a=reshape(...)是典型的可执行赋值语句,编译器解析到这行之后就会退出声明解析模式,进入可执行代码的解析流程。这时候后面跟着的指针声明语句,会被编译器判定为在可执行代码区出现了不该出现的声明语法,正好对应报错提示的第9、10行指针声明位置。
代码中其余需要修正的问题
就算把声明顺序调整正确,现有代码还有几处会触发后续编译错误的问题:
- 指针关联的目标必须和指针的元素总数完全匹配:你写的
matrix(1:3,1:3) => base没有明确指定base的切片范围,Fortran不允许直接跨维度把整个一维指针关联到二维指针对象,需要显式写出和二维数组元素数一致的目标切片(比如3x3矩阵共9个元素,就要取base的1:9切片)。 - 指针关联要求数据类型严格匹配:你定义的数组a是整型,所有指针都是实型,不能跨类型直接通过指针做内存别名访问,需要做类型转换适配。
- 你写的对角线切片
base(1:9:4)逻辑是正确的,对应列主序存储下3x3数组的(1,1)、(2,2)、(3,3)对角线位置,不需要修改。
修正后的可运行代码
program try implicit none ! 所有声明集中放在可执行语句之前 integer, dimension(3,3), target :: a real, pointer, dimension(:, :) :: matrix real, pointer, dimension(:) :: diagonal, base allocate(base(3*3)) ! 可执行代码从这里开始 a = reshape([1, 2, 3, 4, 5, 6, 7, 8, 9], [3,3]) ! 显式指定长度匹配的目标切片,完成二维矩阵的指针重映射 matrix(1:3, 1:3) => base(1:9) diagonal => base(1:9:4) ! 类型转换后填充base的内存,适配实型指针的访问要求 base = real(reshape(a, [9])) print *, diagonal end program try
这段代码运行后会输出对角线元素的实型值:1.0 5.0 9.0。
内容的提问来源于stack exchange,提问作者Domenico Bianchi
相关产品推荐
相关产品推荐

