Compilation 在旧代码上使用gfortran编译
我需要运行一个在这里找到的旧程序:在列表中的标题“kirch1”下。我绝对没有运行fortran代码的经验,但我想从我的MacOSX10.10命令行这样做 我知道我的系统上安装了“gfortan”编译器,但我不确定这是否与旧代码不一样。当我运行Compilation 在旧代码上使用gfortran编译,compilation,fortran,gfortran,Compilation,Fortran,Gfortran,我需要运行一个在这里找到的旧程序:在列表中的标题“kirch1”下。我绝对没有运行fortran代码的经验,但我想从我的MacOSX10.10命令行这样做 我知道我的系统上安装了“gfortan”编译器,但我不确定这是否与旧代码不一样。当我运行gfortran KIRCH1.f(此文件就是上面的文件)时,我得到以下错误: KIRCH1.f:266.8: x(2) = -1. + dx
gfortran KIRCH1.f
(此文件就是上面的文件)时,我得到以下错误:
KIRCH1.f:266.8:
x(2) = -1. + dx
1
Warning: Array reference at (1) is out of bounds (2 > 1) in dimension 1
KIRCH1.f:200.21:
common /param1/ nq2,c2,x2(20),z2(20),qwork2(460),betam2(20)
1
Warning: Padding of 4 bytes required before 'c2' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
KIRCH1.f:285.21:
common /param1/ nq,c,x(20),z(20),qwork(460),betam(20)
1
Warning: Padding of 4 bytes required before 'c' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
Undefined symbols for architecture x86_64:
"_gaussj_", referenced from:
_qinitx_ in ccoKtvwZ.o
"_ns01a_", referenced from:
_ksolv_ in ccoKtvwZ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
这个错误似乎与代码中的语法有关?我怀疑代码本身有什么问题,所以我认为这与我对代码的系统解释有关(因为没有更好的措辞方式)
我应该说,我没有fortran编程经验。我做错了什么
编辑
正如埃德·史密斯所建议的那样
我运行了gfortran sclibdbl.f KIRCH1.f
,但仍然收到以下警告:
KIRCH1.f:266.8:
x(2) = -1. + dx
1
Warning: Array reference at (1) is out of bounds (2 > 1) in dimension 1
KIRCH1.f:200.21:
common /param1/ nq2,c2,x2(20),z2(20),qwork2(460),betam2(20)
1
Warning: Padding of 4 bytes required before 'c2' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
KIRCH1.f:285.21:
common /param1/ nq,c,x(20),z(20),qwork(460),betam(20)
1
Warning: Padding of 4 bytes required before 'c' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons
为我编写了以下文件:
gfortran sclibdbl.f KIRCH1.f
其中,KIRCH1.f
是源代码,sclibdb1.f
是源代码
您只是缺少所需的子例程gaussj
和ns01a
,它们在KIRCH1源代码中引用,但包含在sclibdbl中。netlib.org/conformal/sclibdbl中的代码包括gaussj
和ns01a
子例程(注意,在gfortran中默认情况下,下划线添加到例程名称中)
正如@francescalus所指出的,这是现代fortran编译器和老式fortran代码。警告是因为现代fortran对数组范围的定义更加明确。在这段代码中,x以大小1传递给
yxtran()
,这是正常的,因为传递是对数组开头的引用。当访问元素2时,现代fortran编译器会感到担忧。通过向编译器添加-fno align commons
标志,可以删除两个常见的块错误。可以通过将第258行的x(1)替换为x(n-1)来消除x(1)错误。就个人而言,我不会担心,除非您在运行代码时注意到问题/意外行为(尤其是来自netlib的代码) 第一件事不是错误,而是警告(基于编写代码的旧方法)。您的错误来自链接器。要解决这个问题,您需要找到一些说明:至少告诉您在哪里可以找到引用的其他函数/子例程。啊,我明白了,谢谢。这些子程序可在中找到。我需要做什么才能将它们链接在一起?链接的代码使用的是老派惯例,即声明假定大小(伪参数)数组的维度为1
,例如:双精度x(1)
。您可以安全地忽略该警告,关闭边界检查,或将此类声明更改为双精度x(*)
。另一个警告是因为(可能)nq
是一个4字节的整数,其他所有内容都是双精度
(同样可能,因为您没有共享代码)。你可以忽略这一点,或者如果警告真的让你不高兴,就按它说的去做,把整数移到列表的末尾(当然要注意以同样的方式更改公共语句的每一次出现)。谢谢你的回答。如果你读了我上面的编辑,我仍然会收到一些警告。您也遇到过这种情况吗?对警告添加了更多的解释,希望这会有所帮助(除非出现错误,否则基本上不用担心)。谢谢,这非常有帮助-fno align commons
似乎可能会对性能产生负面影响,在内存中以次优方式调整内容。其他修复(包括忽略警告)可能更可取。@EdSmith这可能不是最好的提问方式,但我觉得发布另一个问题可能有点过火-如何打开并打印写入文件“fort.10”的数据?