我需要运行一个旧程序:http://netlib.sandia.gov/conformal/,标题为" kirch1"在列表中。我绝对没有运行fortran代码的经验,但我想从我的Mac OS X 10.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
这个错误似乎与代码中的语法有关?我怀疑代码本身有什么问题,所以我认为它与代码的系统解释有关(因为没有更好的方法来表达代码)
我没有富有的编程经验,我应该提一下。我做错了什么?
修改
正如Ed Smith所说
我运行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
答案 0 :(得分:2)
以下为我编译:
gfortran sclibdbl.f KIRCH1.f
其中KIRCH1.f
是来自http://netlib.sandia.gov/conformal/kirch1的代码,而sclibdb1.f
是来自http://netlib.org/conformal/sclibdbl的代码。
您刚刚错过了KIRCH1源代码中引用但包含在sclibdbl中的必需子例程gaussj
和ns01a
。 netlib.org/conformal/sclibdbl中的代码包括gaussj
和ns01a
子例程(请注意,默认情况下,gfortran会将下划线添加到例程名称中)。
正如@francescalus所说,它是现代的fortran编译器和旧式的FORTRAN代码。警告是因为现代fortran对数组范围更加明确。在此代码中,x以大小为1传递给yxtran()
,这是正常的,因为传递是对数组开始的引用。当访问元素2时,现代fortran编译器会感到担忧。您可以通过向编译器添加-fno-align-commons
标志来删除这两个常见的块错误。通过用x(n-1)替换线258上的x(1)可以消除x(1)误差。就个人而言,除非您在运行代码时发现问题/意外行为,否则我不会担心(特别是因为它来自netlib)。