键入不匹配错误编译老式F77代码

时间:2017-09-15 13:03:51

标签: input fortran

我想编译一个名为MOLSCAT的计算代码,它使用NAMELIST数据作为输入文件,如Test。根据主代码,编译器读取通道5中的输入。我将输入文件放在主代码文件夹中,并在Linux版本的Simply Fortran中编译主代码。但是无论有没有输入文件,它都会给出输出

==============================================================
Generating Makefile... Okay
==============================================================
Compiling /home/farhad/Downloads/v14.f
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   
  /home/farhad/Downloads/v14.f:2381:17:

   1    PARITY(IEXCH+JLEV(2*NLEV+I)+JTOT+JZCSFL*JLEV(IOFF+I)).LE.0.D0)
             1
   Error: 'mask' argument of 'parity' intrinsic at (1) must be LOGICAL
- - - - -  - - - -- - - - - -- - - - -- - - - - -- - --  -- - - -- - -
/home/farhad/Downloads/v14.f:10720:39:

 4000 CALL CPL24(N,MXLAM,LAM,NLEV,JLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
                                   1
  Warning: Type mismatch in argument 'atau' at (1); passed INTEGER(4) to REAL(8)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Error: Last command making (build/v14.o) returned a bad status
 Error: Make execution terminated

* Failed *

有谁知道这是什么问题?

3 个答案:

答案 0 :(得分:3)

我是MOLSCAT的作者,所以我可以就这个问题给出一些明确的答案。

首先,此查询可能引用的是1994年左右的MOLSCAT版本14,该版本确实是为FORTRAN 77编写的。我可以提供最新版本的2019.0(测试版),该版本已得到充分记录,并将(希望)发布。在2019年。它是免费的。

是的,MOLSCAT v14具有双精度函数奇偶校验,该奇偶校验采用整数参数,如果参数为奇数,则返回+ 1.d0,如果为偶数,则返回-1.d0。此后,FORTRAN引入了具有相同名称的内在函数。在当前版本中,我们已将函数PARSGN重命名。

MOLSCAT还使用一些古老的FORTRAN功能(从FORTRAN IV开始),例如在(1)或(2)处确定数组的尺寸以抑制数组绑定检查。通过将双精度数组的切片传递给将其声明为整数的例程,还可以节省存储空间。因为FORTRAN通过引用传递数组,所以它可以工作,只要编译器不对例程进行过度的狂热比较。只需忽略这些警告即可。

还有一些其他过时/过时的构造,例如计算的GOTO和算术IF。我们大部分已经在人们实际使用的代码部分中重写了它们,但是有些未使用的部分不值得花精力,但是如果用户想要重现旧作品,则不应删除。

Jeremy Hutson

达勒姆大学

J.M。Hutson@durham.ac.uk

答案 1 :(得分:1)

从错误消息中获取提示,提示通常很好。但是,错误经常级联,甚至在代码中也会导致其他问题,这可能就是您看到这么多消息的原因。我的建议是修复列出的第一个错误并尝试再次运行。

这些是您在帖子中显示的错误:

  1. 奇偶校验内在:这里的问题是参数不是逻辑数组。仔细观察 - 似乎有一个错字......寻找一个缺少的括号。修复它,函数应该返回预期的结果。尝试运行代码。其他错误可能会消失。请参阅注释
  2. 类型不匹配:消息非常清楚地表明传入了一个整数(显然是单精度)但代码期望是真实的(显然是双精度)。我看到使用了隐式类型,因此可能是这个特定错误的来源。我建议您通过该程序关注SomeColumn并跟踪其发生的情况。
  3. 另外,来NASA - Mole Scat ??

    注意:啊,我现在看到:ATAU是MOLSCAT源代码中第1169行定义的函数。它不是(当前的,2008年)Fortran标准库的parity。它定义为:

    parity

    源代码与F2008标准中的内在函数之间存在名称冲突。我不知道除了在源代码中重命名函数之外,如何禁用它以兼容F77。您可以在主程序中添加一个新行:FUNCTION PARITY(I) IMPLICIT DOUBLE PRECISION (A-H,O-Z) PARITY=1.D0 IF((I/2)*2-I.NE.0) PARITY=-1.D0 RETURN END 以便使用MOLSCAT中定​​义的函数...有一个相关的讨论here,也许像@SteveLionel这样的人有一些输入

    作为旁注,我不知道为什么这是一个有用的功能。何时会返回external parity

答案 2 :(得分:0)

re:第二种类型不匹配警告。他们似乎故意将符号传递给不同的类型:

 CALL CPL24(N,MXLAM,LAM,NLEV,JLEV,JLEV,J,MVALUE ....

注意位置5和6中重复的整数数组jlev,然后是sub:

 ENTRY CPL24(N,MXLAM,LAM,NLEV,JLEV,ATAU,J,MVAL ..

他们在这些位置有一个整数和真实的虚拟变量。如果不解析整个代码,我相信这是故意的,你应该忽略这个警告。

我注意到的另一件事是,他们在整个地方对数组进行了维度2

  INTEGER J(N),L(N),LAM(2),JLEV(2)
  INTEGER PRINT
  DIMENSION ATAU(2),VL(2)

我很确定(之前已经看到过这些)这些实际上是假设的大小数组(基本上依靠旧编译器不进行边界检查)。没关系,但这意味着你将无法对此代码进行边界检查。 任何旧计时器都会猜到他们使用2的原因?