Compilation 在旧代码上使用gfortran编译

Compilation 在旧代码上使用gfortran编译,compilation,fortran,gfortran,Compilation,Fortran,Gfortran,我需要运行一个在这里找到的旧程序:在列表中的标题“kirch1”下。我绝对没有运行fortran代码的经验,但我想从我的MacOSX10.10命令行这样做 我知道我的系统上安装了“gfortan”编译器,但我不确定这是否与旧代码不一样。当我运行gfortran KIRCH1.f(此文件就是上面的文件)时,我得到以下错误: KIRCH1.f:266.8: x(2) = -1. + dx

我需要运行一个在这里找到的旧程序:在列表中的标题“kirch1”下。我绝对没有运行fortran代码的经验,但我想从我的MacOSX10.10命令行这样做

我知道我的系统上安装了“gfortan”编译器,但我不确定这是否与旧代码不一样。当我运行
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”的数据?