使用现代编译器编译有问题的Fortran 77代码

4
我正在尝试编译一款Fortran 77编写的软件。我应该指出,我对Fortran并不了解,真的不想修改此软件的代码,特别是因为我不确定软件的许可证,并且不知道是否能够重新分发我修改后的版本。
在OS X和Windows上,使用g77编译器编译代码很顺利(这些系统都可以相对容易地获得该编译器)。但是,在我的Ubuntu系统上,我无法获取到g77,并且如果我尝试安装它的旧版本,似乎会破坏我的整个GCC安装。我已经尝试使用gfortran和g95编译代码,但两者都无法正常工作,具体原因如下:
代码使用实数变量作为循环索引(是的,我知道,这是个坏主意)。 g95支持使用-freal-loops选项实现此功能,但gfortran不支持。
代码使用实数变量来索引数组,gfortran将支持此功能(并发出警告),但g95将不支持。
有人能否建议一种方法,使用像g95或gfortran这样的现代且易于获取的编译器来编译带有这两个“问题”功能的代码?

3
你可以尝试添加“-std = legacy”,但我不确定它是否有效。有关更多细节,请参见此链接:http://gcc.gnu.org/ml/fortran/2005-05/msg00371.html。 - Dan
1
我尝试了在gfortran中使用-std=legacy,就像Dan建议的那样。使用实数变量作为循环索引和数组索引被接受且没有出现错误消息,程序正常工作。 - M. S. B.
为什么你会试图重新分发代码,而你承认你没有编写该代码并且没有该代码的许可证? - Michael McGuire
@Dan:谢谢,添加-std=legacy起作用了,一旦我告诉它也将代码视为固定格式但没有字符限制。 - robintw
2
@DigitalRoss,这简直是不正确的。32位IEEE 754标准中,尾数有23位或者说总共有24位,整数部分有一个隐含的“1”。这限制了能够精确表示的整数范围为[0, 2^24-1],小于32位int的完整范围(还有其他能够精确表示的整数超出了该范围,但它们不是连续的)。使用双精度可以将该范围扩展到[0, 2^53-1],仍然小于long的完整范围。 - Hristo Iliev
显示剩余5条评论
1个回答

3

将参数-std=legacy传递给gfortran。在遗留模式下,已经移除的F95特性(如实数循环和数组索引)应该可以编译(可能会有警告)。


1
新版本(10.2)无法识别REAL16(更不用说COMPLEX32了),而旧版本可以。 - user50619

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接