【问题标题】:Compaq Visual Fortran versus gfortran FORMAT statement differencesCompaq Visual Fortran 和 fortran FORMAT 语句的区别
【发布时间】:2013-04-12 01:59:36
【问题描述】:

我有一大段 Fortran 代码,我想用 gfortran 编译该代码。我以前没有使用过 Fortran。我不知道代码的具体规范是什么,但我发现它至少可以用 Compaq Visual Fortran 6.6 编译——所以我猜它是在它下面写的。

一般的问题是:有没有 Compaq Visual Fortran 到 gfortran 的自动翻译器?我没有找到。

事实上,经过一些修复,代码确实可以使用 gfortran 进行编译,但在运行时出现异常:它没有按预期读取输入文件。下面是代码示例:

CHARACTER*6  VAR1
CHARACTER*1  VAR2
CHARACTER*3  VAR3

OPEN (UNIT=CHANNEL, FILE=FILENAME, STATUS='OLD')
READ(CHANNEL, 38)VAR1,VAR2,VAR3

38 FORMAT(15X,A6,7X,A1,14X,A3)

还有一个数据示例:

123456789012345------'1234567-'''''12345678901234---
.ABCDEF.GHI.JKLMNOPQR.STUVWX.YZABC.DEF.GHI.JKLM....P
123456789012345------1234567-12345678901234---

第一行是原始应用程序如何读取它,第三行 - gfortran,第二行 - 数据文件中的行示例(1-9 用于省略字符,- 用于读取,' 用于未提及的格式, . 在示例中而不是空格在原行)。

因此,结果将是:

Origanal: VAR1 == 'MNOPQR', VAR2 == 'Y', VAR3 == '..P' - correct
gfortran: VAR1 == 'MNOPQR', VAR2 == '.', VAR3 == 'JKL' - wrong

gfortran 非常简单:它跳过 15 个字符、读取 6 个字符、跳过 7 个字符等等。但原来的应用程序是另一种方式,我猜不出它的逻辑。它仍然读取指定数量的字符,但跳得比指定的更远。它确实会读取预期读取的内容。

我尝试指定输入文件 (15X,A6,8X,A1,19X,A3) 中出现的确切长度,它适用于 gfortran,但这不是长期解决方案。

所以,我更具体的问题是:gfortran 和 Compaq Visual Fortran 6.6 中的FORMAT 语句有什么不同吗?(也许我错误地认为FORMAT 是原因)

UPD

我想,可能有一些东西可以分成单词左右。我的意思是 gfortran 只计算字符数,但 CVF 做了一些不同的事情。

【问题讨论】:

  • 对于您的一般问题,非标准编辑说明符可能会导致差异。 X 和 A 是标准的。你能更好地解释一下原始应用程序的作用吗?
  • 显示随附的 READ 语句。使用制表符输入可能会导致混淆。您必须进行哪些“修复”才能让代码使用 gfortran 编译?
  • @george 有一个单词列的数据文件。列由空格分隔。空格也用于对齐其列中的单词。通常,程序不会读取整行甚至整个单词(单词用于使文件具有人类可读性,应用程序仅读取某些列中的一个字母以理解数据;它还读取其他列中的整个单词)。因此,原始应用程序读取该数据,然后对其进行操作(但操作不感兴趣 - 我打印的只是读取数据,它不是预期的)。
  • @IanH OPEN (UNIT=CHANNEL, FILE=FILENAME, STATUS='OLD') 然后READ(CHANNEL, 38)VAR1,VAR2,VAR3。修复:1) 某些函数具有返回类型 INTEGER,但用作 INTEGER*1 - 全部为 INTEGER(它们总是返回 '1' 或 '0')和 2) 一个函数与某些标准 gfortran 函数冲突- 改变了它的名字。但我猜这些修复不会影响该问题,因为它们稍后会出现在应用程序工作中(应用程序无法读取数据文件头)。
  • (最好使用请求的附加信息来编辑您的问题,而不是将其添加到 cmets。)显示正在读取的典型行的文本,显示 cvf 读取的变量的值,并通过gfortran。

标签: fortran translate gfortran intel-fortran


【解决方案1】:

如果这是一篇论文练习,有人问我 VAR1、VAR2 和 VAR3 的值是多少,我会给出与 gfortran 相同的结果。

你说的很奇怪。我刚刚在 PowerStation4、IVF7(CVF6.6 之前和之后的版本)上尝试过,它们都给出了与 gfortran 相同的结果。我还尝试过使用不同的字对齐方式和不同的数据类型(在 gfortran 中不合法,但您可以在较旧的编译器上执行此操作)并得出相同的答案。

您确定它正在读取您认为正在读取的文件吗? powerstation 和某些版本的 cvf 存在 8.3 文件名问题。他们无法处理长文件名。

【讨论】:

  • "> 我刚刚尝试过 [...],它们都给出了与 gfortran 相同的结果。”我也已经在 CVF6.6 上尝试过,它也给出了与 gfortran 相同的结果。我现在很困惑。无论如何,感谢您的回答 - 现在我确信 FORMAT 不是发生奇怪事情的原因。文件名一切正常,顺便说一下,它是 8.3。
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2019-05-29
  • 1970-01-01
  • 2017-01-18
  • 2020-11-13
  • 2011-02-23
相关资源
最近更新 更多