【问题标题】:Fortran format string in read statement读取语句中的 Fortran 格式字符串
【发布时间】:2017-06-09 15:45:04
【问题描述】:

我无法让格式字符串被 Fortran 程序中的读取语句接受,该程序由 OS X 下的 gfortran 编译。

read 语句和字符串构成两行代码,我收到的各种错误消息似乎取决于这两个语句如何并行使用(另外,以防万一,要声明的数组读入):

read(10, format) ( velmatt(n,row,i),m=1,3 )

format = "(11x,' x   ',a3,2x,i8,6x,3f11.6)"

这会导致错误,

Fortran runtime error: Missing initial left parenthesis in format

我必须补充一点,我还为 format 语句尝试了一些替代语法,它由 read 函数调用,因为推荐的确切形式似乎有所不同(我是 fortran 新手)。这里有一些替代方案,

read(10, 11) ( velmatt(n,row,i),m=1,3 )

11 format(11x,' x   ',a3,2x,i8,6x,3f11.6)

甚至

read(10, 'format') ( velmatt(n,row,i),m=1,3 )

format = (11x,' x   ',a3,2x,i8,6x,3f11.6)

其中至少一个会出错

Fortran runtime error: Constant string in input format

而且两者之一也报此错误,

Missing format label at (1) 

我读到格式声明应该是用引号括起来的括号,但在这种情况下,我的第一种方法应该有效吗?因此,错误消息似乎是相互补充的,而且我还缺少其他一些东西..

(我还不清楚在 fortran 中使用正确单元号的重要性,如果这是部分或全部问题,请见谅)

无论如何,以上(可能还有我尝试过的更多)都不能让编译器满意。

【问题讨论】:

  • 真的是在read语句中引用format的值吗?也就是说,第一个示例是否正确显示了您使用的行的顺序?
  • 在 Absoft Pro Fortran 中读取是否有效?您将哪些选项传递给编译器?
  • @francescalus 行的顺序与程序中使用的一样,是的,但是当我在程序开始时使用其他初始化设置格式命令时,错误消息仍然相同。
  • @MichaelShopsin 我真的不确定 - 我怎么知道我使用的是 Absoft Pro 版本的 fortran?
  • @JSmoov 有许多适用于 MacOS X 的 Fortran 编译器,它们的行为可能略有不同。 F77 与 F95/99 也可以改变接受的格式语句。

标签: fortran format


【解决方案1】:

在您发布的示例中,只有一个带有

read (10,11)

是正确的。首先,您要求 READ 在名为 FORMAT 的变量中查找格式,我假设您之前已将其声明为 CHARACTER。如果您首先指定了格式,它可能会起作用,但这不是推荐的方法。但事实上,该变量未初始化并且没有正确的值。

您可以像处理 (10,11) 情况一样使用带标签的格式,也可以像这样将格式本身放在 READ 中:

read(10, "(11x,' x   ',a3,2x,i8,6x,3f11.6)") ...

【讨论】:

  • 感谢史蒂夫的建议,我已经尝试了两种方法,但我现在收到了另一种错误消息,“在文件 Spectrum.f90 的第 51 行(单位 = 10,文件 = ' fort.10') Fortran 运行时错误:输入格式中的常量字符串 (11x,'x',a3,2x,i8,6x,3f11.6)"
  • 哦,我错过了。您不能将常量字符串放在 READ 语句中使用的格式中。这就是你在 WRITE 中使用的那种东西。
  • @SteveLionel 那么,有 READ 的解决方案吗?
  • @JordanHe 你想要什么样的解决方案?您可以在 READ 中使用存储在字符变量中的格式。或者,也许您想从字符串中读取?这被称为“内部读取”,而不是单元号,您指定一个字符变量。或许您应该提出一个新问题并解释您要查找的内容。
  • @SteveLionel 我问的是如何让read(10, "(11x,' x ',a3,2x,i8,6x,3f11.6)") ... 像我们期望的那样工作。我有与此完全相同的旧 Fortran 代码,编译器抱怨 Fortran runtime error: Constant string in input format。我从this link 找到了解决方案。
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
相关资源
最近更新 更多