Fortran模块子程序无打印输出及未生成data.dat文件问题求助
解决Fortran模块子程序未执行、无输出及数据文件生成问题
问题根源及修正点
未调用核心子程序
主程序定义了变量r和n,但从未调用模块中的area子程序,导致子程序内的计算、打印、文件写入逻辑完全没执行——这是最关键的问题。变量类型不兼容
主程序中n是integer类型,但模块内area子程序的形参n被声明为real,类型不匹配会引发编译告警甚至运行错误。程序名拼写不一致
主程序开头是program maths,结尾却写了end program math,名称不统一,虽部分编译器兼容,但需修正为规范写法。模块常量声明不严谨
原代码中pi未用parameter修饰,无法保证其常量属性,需添加parameter关键字确保值不可修改;同时area子程序未被设为public,主程序调用时可能受限。
修正后的完整代码
maths.f90
program maths use geometry implicit none real :: r integer:: n r = 20.0 n = 5 print *, 'pi and r', pi, r ! 调用模块中的area子程序,传递输入参数 call area(r, n) print*, 'area from module (last computed value)', area_calc end program maths
geometry.f90
module geometry implicit none ! 用parameter声明常量pi,确保其值不可修改 double precision, parameter :: pi= 4.*atan(1.) double precision :: area_calc ! 模块全局变量,存储计算结果 ! 将area子程序设为public,允许主程序调用 public :: area_calc, pi, area contains subroutine area(r, n) real, intent(in) :: r integer, intent(in) :: n ! 修正n的类型为integer,与主程序变量匹配 integer :: i ! 打开文件时添加status='replace',覆盖已有文件或创建新文件 open(unit=10, file='data.dat', status='replace') do i=1,5 area_calc = n * pi * r * r * i write(10,*) area_calc, i print*, 'sequence module', area_calc, i write(*,*) 'area within module', area_calc, i end do close(10) end subroutine area end module geometry
编译与运行
使用原Makefile即可正常编译:
- 清理旧编译文件:
make clean - 编译生成可执行文件:
make - 运行程序:
./maths
运行后会在终端输出计算过程,同时生成data.dat文件,包含循环中每次计算的area_calc和i值。
内容的提问来源于stack exchange,提问作者SofaScientist
相关产品推荐
相关产品推荐

