Fortran函数中intent(inout)的用法及编译错误问题排查
报错根因
这个编译错误和intent(inout)属性本身无关,问题出在函数返回值命名和形参重名:
你定义函数时写的function cell_blocked(row,col,ncb) result (ncb),将函数返回值的名称和传入形参ncb设为完全相同的标识符。Fortran语法规定result()后声明的标识符是函数返回值的专属名称,作用域内会覆盖同名的其他标识符。此时你给ncb添加intent(inout)属性的声明,编译器会将其识别为给返回值添加intent属性——而返回值不属于过程传入的虚参,不允许设置intent属性,同时因为同名冲突,编译器无法正确识别函数cell_blocked的类型,最终抛出无隐式类型的报错。
Fortran函数intent(inout)使用规则
- Fortran的function和subroutine对形参intent属性的支持规则完全一致,三类
intent(in)/out/inout都可以合法用在函数的形参上,在函数内修改intent(inout)形参的值(即函数副作用)是符合语法规范的。 - 语法红线:
result()声明的返回值名称不能和任何传入形参重名。返回值是函数自身的输出载体,不属于传入形参,不能对其设置任何intent属性。 - 所有Fortran代码都建议在程序单元开头加
implicit none,强制显式声明所有变量、形参、返回值的类型,避免隐式类型带来的各类诡异报错。
需求实现方案
你要实现「传入计数器ncb,满足条件时更新值并返回」的逻辑,有两种合法写法:
- 保留函数写法,修改返回值名称避开重名即可:
function cell_blocked(row,col,ncb) result(res) implicit none integer, intent(in) :: row,col integer, intent(inout):: ncb integer :: res ! 显式声明返回值类型 if (row == col) ncb = ncb + 1 res = ncb ! 返回更新后的计数器值 end function cell_blocked
- 优先使用subroutine实现:这是Fortran社区的通用惯例——如果过程需要修改传入参数、产生副作用,优先选择subroutine;无副作用、仅根据输入计算单一返回值的场景才用function。你之前写的可正常编译的subroutine版本是更符合编码规范的实现。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

