Fortran公共块指针使用遇段错误:PrintArray.f崩溃如何修复?
Fortran段错误问题修正方案
问题根源
你用include文件声明指针的方式会导致主程序和子程序各自拥有独立的指针变量:主程序中分配内存的p_dynamicArray和子程序里的p_dynamicArray是完全无关的两个变量,子程序内的指针从未被分配内存,访问时自然触发段错误。
修正方法一:使用模块(现代Fortran推荐方案)
模块是Fortran标准的变量共享方式,能让所有关联模块的程序单元访问同一个变量。
- 创建模块文件
array_mod.f90:
MODULE array_mod IMPLICIT NONE REAL, DIMENSION (:), POINTER :: p_dynamicArray END MODULE array_mod
- 修改主程序
main.f:
PROGRAM Main USE array_mod IMPLICIT NONE INTEGER :: ArraySize, i ArraySize = 4 ALLOCATE (p_dynamicArray(ArraySize)) DO i = 1, ArraySize p_dynamicArray(i) = i END DO CALL PrintArray() DEALLOCATE (p_dynamicArray) END PROGRAM Main
- 修改子程序
PrintArray.f:
SUBROUTINE PrintArray() USE array_mod IMPLICIT NONE INTEGER :: i DO i = 1, SIZE(p_dynamicArray) ! 用SIZE函数获取数组长度,避免硬编码 WRITE(*,*) "PrintArray.f: ", p_dynamicArray(i) END DO END SUBROUTINE PrintArray
- 编译命令(以gfortran为例):
gfortran array_mod.f90 main.f PrintArray.f -o main
修正方法二:将指针作为参数传递(更符合封装原则)
通过参数传递指针,避免全局变量的副作用,是模块化编程的常用方式。
- 修改主程序
main.f:
PROGRAM Main IMPLICIT NONE REAL, DIMENSION (:), POINTER :: p_dynamicArray INTEGER :: ArraySize, i ArraySize = 4 ALLOCATE (p_dynamicArray(ArraySize)) DO i = 1, ArraySize p_dynamicArray(i) = i END DO CALL PrintArray(p_dynamicArray) DEALLOCATE (p_dynamicArray) END PROGRAM Main
- 修改子程序
PrintArray.f:
SUBROUTINE PrintArray(arr) IMPLICIT NONE REAL, DIMENSION (:), INTENT(IN) :: arr ! 用假定形状数组接收指针 INTEGER :: i DO i = 1, SIZE(arr) WRITE(*,*) "PrintArray.f: ", arr(i) END DO END SUBROUTINE PrintArray
- 编译命令:
gfortran main.f PrintArray.f -o main
额外注意事项
- 避免用
include共享变量,这是旧Fortran的遗留写法,模块是现代标准的首选。 - 始终添加
IMPLICIT NONE,强制显式声明所有变量,避免隐式类型导致的潜在错误。 - 不要硬编码数组长度,用
SIZE()函数动态获取,提升代码健壮性。
内容的提问来源于stack exchange,提问作者JB_User
相关产品推荐
相关产品推荐

