在文件名中附加字符串

时间:2016-07-12 16:42:05

标签: string fortran filenames fortran77

现在我有类似的东西

program prova
CHARACTER (LEN=4) :: mvalue
common mvalue   
mvalue='01.0'
call funzione(var1, var2,...)
end

subroutine funzione()
common mvalue
*(stuff with var1, var2, ...)*
open(10,file="./prova_"//mvalue//"_.res")
end

并且编译器返回

 open(10,file="./prova_"//mvalue//"_.res")                         
                                        1
 Error: Operands of string concatenation operator at (1) are CHARACTER(1)/INTEGER(4)

我不知道我是否可以使用"隐含无"真实代码中的说明,因为它可能会弄乱别的东西...我很抱歉,如果我不能更精确,但正如我告诉你我是FORTRAN的新手,以及代码有点扩展(写得非常糟糕)。 我更喜欢将mvalue变量传递给例程,但如果我尝试

program prova
CHARACTER (LEN=4) :: mvalue
mvalue="01.0"
call func(mvalue)
end


subroutine func(mvalue)
open(10,file="./prova_"//mvalue//"_.res")
end

它返回

open(10,file="./prova_"//mvalue//"_.res")                         
                           1
Error: Operands of string concatenation operator at (1) are CHARACTER(1)/INTEGER(4)

prova.f:4.16:
call func(mvalue)                                                 
Warning: Type mismatch in argument 'mvalue' at (1); passed CHARACTER(1) to INTEGER(4)

2 个答案:

答案 0 :(得分:2)

你的子程序:

subroutine funzione()
common mvalue
*(stuff with var1, var2, ...)*
open(10,file="./prova_"//mvalue//"_.res")
end

缺少implicit none!始终在每个范围单元中使用它,没有任何例外!

未声明mvalue的类型,因此隐式为整数。

您必须在每个范围单元中声明类型。使用common分享它是不够的!

在Fortran 90中,正确的是使用模块而不是常用块。在任何编程语言中,一般来说,正确的方法是不共享全局变量(无论是使用公共变量,使用模块还是任何其他方式),而是将字符串作为参数传递给子例程。

对于您的新编辑,相同的建议仍然有效:您的子例程丢失implicit none!始终在每个范围单元中使用它,没有任何例外!

如果您无法使用implicit none,那么您必须!!!!! 准备好诊断来自未声明变量的错误。 绝对必要!

字符伪参数声明为character*(*) mvalue

答案 1 :(得分:0)

正如评论者已经指出的那样,您正在使用两种不同的引号,以便它通过编译时间,但在运行时失败。

file=伪参数需要一个字符串,它会得到一个很长的字符串:整个./results/file_01.0_R00.res',status='unknown。但是当它试图打开该文件时,它会失败:这根本就没有有效的文件名。

在两个实例中('之后和"之前)简单地将.res替换为unknown会导致错误消失。