【发布时间】: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