Fortran包装器用于字符函数trim(),adjustl()

时间:2016-03-07 12:09:08

标签: function fortran character

我编写了一个简单的包装器,方便使用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

1 个答案:

答案 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。不要使用它们,甚至可能忘记它们的存在。