Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 字符函数trim()、adjustl()的Fortran包装器_Function_Fortran_Character - Fatal编程技术网

Function 字符函数trim()、adjustl()的Fortran包装器

Function 字符函数trim()、adjustl()的Fortran包装器,function,fortran,character,Function,Fortran,Character,为了方便使用Fortran内部函数“trim()”和“adjustl()”,我编写了一个简单的包装器: 但是,我无法使用它,因为GNU Fortran编译器失败并显示以下消息: farm_par.f90:633:31: 19 OPEN(iout,file=TRIMADJL(rankstr//fout),access='sequential',status='unknown', & 1 Warning: Non-variable

为了方便使用Fortran内部函数“trim()”和“adjustl()”,我编写了一个简单的包装器:

但是,我无法使用它,因为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

现代Fortran具有可分配的延迟长度字符串:

FUNCTION trimadjl(str)
character(len=:), allocatable :: trimadjl
character(len=*), intent(in) :: str

trimadjl = trim(adjustl(str))

END FUNCTION
这样的函数不能是外部函数,请将其放入模块中。另见

作为@HighPerformanceMark注释,第一条错误消息来自您将伪参数
str
标记为
intent(inout)
,然后将表达式传递给它
rankstr//fout
是一个复合表达式,不能传递到
intent(inout)
函数中,因为它不是变量。尽可能在函数中使用
intent(in)
参数


不要使用
character(*)
返回函数,除非您真正了解的详细含义!尽可能避免它们。它们已经过时,而且非常混乱。请参见中的“假定长度字符函数”。不要使用它们,甚至可能会忘记它们的存在。

稍微放一放,但是没有必要
trim
你给
file=
的字符串。空白填充物不会伤害任何东西。你也可以在这里使用
adjustl
,当然不会有什么伤害。但我有一些用于后期处理的shell脚本,如果文件名中有空格,这些脚本就会失败。我创建了一个带有
trimajl()
函数实现的模块,用于我的主程序。但是,我遇到另一个错误:
位于(1)的文件标记必须是CHARACTER类型。不知何故,程序没有选择函数的返回类型。@mabalenk什么是
标记
?如果没有更完整的示例,我无法说任何事情。
tag
是文件打开例程的属性:open(iout,file=trimajl(rankstr//fout),…)1错误:位于(1)的文件标记必须是CHARACTER@mabalenk这是没有用的,用一个更完整的例子编辑你的问题。包括模块。我创建了一个简单的示例来向您展示我的问题,它很有效。当我在原始源代码中使用完全相同的命令序列时,编译器将失败。在给你回复之前,我需要检查一下编译器选项。
FUNCTION trimadjl(str)
character(len=:), allocatable :: trimadjl
character(len=*), intent(in) :: str

trimadjl = trim(adjustl(str))

END FUNCTION