我编写了一个简单的包装器,方便使用Fortran内部函数的trim()'和'adjustl()':
character(len=*) FUNCTION trimadjl(str)
character(len=*), intent(inout) :: str
trimadjl = trim(adjustl(str))
END FUNCTION
但是,我无法使用它,因为GNU Fortran编译器失败并显示以下消息:
farm_par.f90:633:31:
19 OPEN(iout,file=TRIMADJL(rankstr//fout),access='sequential',status='unknown', &
1
Warning: Non-variable expression in variable definition context (actual argument to INTENT = OUT/INOUT) at (1) farm_par.f90:633:22:
19 OPEN (iout,file=TRIMADJL(rankstr//fout),access='sequential',status='unknown', &
1
Error: Function ‘trimadjl’ is declared CHARACTER(*) and cannot be used at (1) since it is not a dummy argument
该函数在子例程的标题中声明为外部:
character(len=*), external :: trimadjl
答案 0 :(得分:3)
现代Fortran具有可分配的延迟长度字符串:
FUNCTION trimadjl(str)
character(len=:), allocatable :: trimadjl
character(len=*), intent(in) :: str
trimadjl = trim(adjustl(str))
END FUNCTION
这样的功能不能是外部的,把它放到模块中。另请参阅Fortran character-returning function of unknown length
在@HighPerformanceMark注释时,第一条错误消息来自您将伪参数str
标记为intent(inout)
,然后将表达式传递给它。 rankstr//fout
是一个复合表达式,不能传递给intent(inout)
函数,因为它不是变量。尽可能在函数中使用intent(in)
个参数。
不要使用character(*)
返回功能,除非您确实知道详细信息的含义!尽可能避免使用它们。它们已经过时且非常令人困惑。请参阅" 假设长度字符函数"在http://fortranwiki.org/fortran/show/Modernizing+Old+Fortran。不要使用它们,甚至可能忘记它们的存在。