向函数传未知长度字符串时遇Fortran编译错误求助
Fortran自定义to_upper函数编译错误解决方法
问题重现
编译错误提示:
错误:在(1)处的'to_upper'需要显式接口:返回值字符长度非恒定
对应错误代码行:
4 | character(100) :: to_upper | 1
原程序代码:
program main implicit none character(100) :: to_upper character(100) :: some_str some_str = "hello world" some_str = to_upper(some_str) end program main pure function to_upper (str) Result (string) ! 将字符串转为大写 implicit None Character(*), Intent(In) :: str Character(LEN(str)) :: string ! 算法实现部分... end function
错误原因
原代码存在两个核心问题:
- 主程序中错误地将
to_upper声明为固定长度字符变量,而非函数; to_upper函数的返回值长度由输入字符串长度(LEN(str))决定,属于非恒定长度,Fortran对此类函数要求必须提供显式接口,否则编译器无法确定返回值的长度信息。
解决方法
方法1:将函数放入模块(推荐)
模块内的函数会自动生成显式接口,主程序通过use语句调用即可:
module string_utils implicit none contains pure function to_upper (str) Result (string) ! 将字符串转为大写 implicit None Character(*), Intent(In) :: str Character(LEN(str)) :: string ! 算法实现部分... end function to_upper end module string_utils program main use string_utils implicit none character(100) :: some_str some_str = "hello world" some_str = to_upper(some_str) end program main
方法2:将函数定义为主程序的内部函数
把to_upper函数放在主程序的contains块内,主程序可直接识别其接口:
program main implicit none character(100) :: some_str some_str = "hello world" some_str = to_upper(some_str) contains pure function to_upper (str) Result (string) ! 将字符串转为大写 implicit None Character(*), Intent(In) :: str Character(LEN(str)) :: string ! 算法实现部分... end function to_upper end program main
方法3:手动声明显式接口块
在主程序中为to_upper函数添加接口块,明确参数和返回值信息:
program main implicit none interface pure function to_upper(str) result(string) character(*), intent(in) :: str character(len(str)) :: string end function to_upper end interface character(100) :: some_str some_str = "hello world" some_str = to_upper(some_str) end program main pure function to_upper (str) Result (string) ! 将字符串转为大写 implicit None Character(*), Intent(In) :: str Character(LEN(str)) :: string ! 算法实现部分... end function to_upper
内容的提问来源于stack exchange,提问作者Steve Lord
相关产品推荐
相关产品推荐

