现在我有类似的东西
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)
答案 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
会导致错误消失。