【问题标题】:Attach strings in filename在文件名中附加字符串
【发布时间】:2016-07-12 16:42:05
【问题描述】:

现在我有这样的东西

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)

【问题讨论】:

  • "_R00.res' 看起来不对,必须使用相同的" 或'。
  • 'unknown" 也是无效的。
  • 另一个建议:我看不出有任何理由使用status='unknown'。把它放在外面。或者如果你有理由使用一些已知的状态值。
  • 您必须展示完整的代码示例。请参阅如何创建最小、完整且可验证的示例 stackoverflow.com/help/mcve
  • 这是一个 7000 行长的代码,我只展示这部分是因为我认为错误就在这里,因为在我修改之前它工作得非常好(文件名曾经被修复)...你需要还想知道什么特别的?

标签: string fortran filenames fortran77


【解决方案1】:

你的子程序:

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

【讨论】:

    【解决方案2】:

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

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

    在两种情况下(.res 之后和unknown 之前)只需将' 替换为" 即可消除错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多