Compaq Visual Fortran与gfortran格式语句的差异

Compaq Visual Fortran与gfortran格式语句的差异,fortran,translate,gfortran,intel-fortran,Fortran,Translate,Gfortran,Intel Fortran,我有一大块Fortran代码,我想用gfortran编译这段代码。我以前从未使用过Fortran。我不知道代码的具体规格,但我发现它至少可以用Compaq Visual Fortran 6.6进行编译,所以我可能猜它是用它编写的 一般问题是:是否有Compaq Visual Fortran到gfortran的自动翻译程序?我没有找到 事实上,在经过一些修复后,代码确实使用gfortran进行编译,但在运行时会出现错误:它没有按照预期读取输入文件。下面是一个代码示例: CHARACTER*6 V

我有一大块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中的
格式
语句有什么不同吗?
(可能是我错误地认为
格式
是原因)

UPD


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

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

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


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

对于您的一般问题,可能是非标准编辑说明符导致了差异。不过,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函数冲突-更改了其名称。但我想这些修正不会影响这个问题,因为它们会出现在应用程序工作的后面(应用程序无法读取数据文件头)。(最好用请求的附加信息编辑您的问题,而不是将其添加到注释中。)显示正在读取的典型行的文本,显示cvf和gfortran读取的变量值。“>我刚刚试过[…],结果都和gfortran一样。“我已经在CVF6.6上试过了,结果也和gfortran一样。我现在很困惑。无论如何,谢谢你的回答-现在我确信
格式
不是奇怪事情发生的原因。文件名一切正常,顺便说一下,它是8.3。