1

我有一大段 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 做了一些不同的事情。

4

1 回答 1

0

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

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

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

于 2013-04-21T07:41:06.503 回答