Fortran中如何将数组作为函数的输入与输出?
搞定Fortran数组自乘函数的调用问题
嘿,我来帮你解决这个数组自乘函数的调用问题!先给你一个完整的可运行实现,再拆解关键要点,帮你避开那些容易踩的坑。
完整可运行代码示例
program main implicit none integer, parameter :: M = 5 ! 自定义数组大小 real :: B(M), XX(M) integer :: i ! 初始化输入数组 do i = 1, M B(i) = real(i) end do ! 调用函数获取自乘后的数组 XX = square_array(B, M) ! 打印结果验证 print *, "原始数组:" print *, B print *, "自乘后的数组:" print *, XX contains ! 定义数组自乘函数 function square_array(arr, n) result(res) implicit none integer, intent(in) :: n real, intent(in) :: arr(n) real :: res(n) ! 结果数组,维度与输入严格匹配 integer :: i do i = 1, n res(i) = arr(i) * arr(i) ! 每个元素执行自乘运算 end do end function square_array end program main
避免调用失败的核心要点
- 强制显式声明变量:一定要加
implicit none!这能杜绝很多隐式类型匹配错误——比如编译器误把函数名当成整数类型,导致返回值和接收变量不兼容。 - 保证数组维度一致:函数返回的结果数组
res,维度必须和输入数组arr、主程序里的接收数组XX完全匹配,这里通过传入的n来统一控制大小。 - 使用显式接口:上面的例子把函数放在主程序的
contains块里,编译器能自动识别函数的参数类型、返回值类型和数组维度,这是最稳妥的方式。如果你的函数要放在单独文件里,一定要把它封装到模块中,主程序通过use模块来获取显式接口——隐式接口是绝大多数调用失败的根源! - 标记参数意图:用
intent(in)标记输入参数,明确告诉编译器这个参数是只读的,避免意外修改输入数组,也能让编译器做更优的优化。
你可能踩过的常见错误
如果之前的代码没法正常运行,大概率是以下情况之一:
- 没加
implicit none,导致函数返回值类型和主程序接收变量类型不匹配; - 函数的结果数组没有正确指定维度,或者主程序接收数组的维度和函数返回值不一致;
- 函数单独定义但没有显式接口(既没放
contains里,也没封装到模块,也没写interface块),编译器无法正确解析函数的参数和返回值信息。
比如下面就是一个典型的错误写法(缺少显式接口导致调用失败):
! 错误示例:无显式接口的独立函数 program main implicit none integer, parameter :: M=5 real :: B(M), XX(M) XX = square_array(B, M) ! 编译器无法识别函数接口,会报错 end program main function square_array(arr, n) integer :: n real :: arr(n) real :: square_array(n) integer :: i do i=1,n square_array(i) = arr(i)**2 end do end function
内容的提问来源于stack exchange,提问作者Mohammad Amin Seifinia
相关产品推荐
相关产品推荐

