3

我正在尝试编译一些在我的工作中使用 g77 的旧 Fortran 代码。我是 Fortran 和一般编程的新手,我正在尝试解决所有错误。这是 g77 正在返回的:

afsirs.for: In subroutine `sw':
afsirs.for:1209: 
     DATA BLANK /'    '/
                 ^
Type disagreement between expressions at (?) and (^)

如果我理解正确,这与以下代码片段中使用的 Hollerith 常量有关:

1209  DATA BLANK /'    '/

...

2727  DIMENSION ARRAY(22,54),IAXIS(13),YAXIS(6),Y(52),X(52),YSC(12)
      CHARACTER CTYPE*12
      DATA EYE, BLANK, DASH, PLUS, SYMBOL/1HI,1H ,1H-,1H+,1H*/
      DATA YSC/1,2.5,5,10,20,40,50,60,75,100,150,200/
...

2753   C...... ZERO ARRAY
       DO 100 I = 1,22
       DO 100 J = 1,54
  100  ARRAY(I,J) = BLANK

我已经尝试了一些东西,用字符语句替换 Holleriths 等,但我认为我遗漏了一些东西。我将不胜感激有关如何进行的任何建议。

编辑 - -

 1209  DATA BLANK /'    '/

是一个名为“SW”的子程序的一部分,它计算土壤水分的有效性。然后在绘图子程序“plot”中初始化 BLANK。

4

2 回答 2

1

如果有帮助,此数据状态会将眼睛、空白、破折号、加号和符号中的每一个初始化为单个字符 hollerith:

  DATA EYE, BLANK, DASH, PLUS, SYMBOL/1HI,1H ,1H-,1H+,1H*/

等效地(并且 IMO 优先考虑可读性),

  DATA EYE/1HI/, BLANK/1H /, DASH/1H-/, PLUS/1H+/, SYMBOL/1H*/

即使我还不够老,不记得是否需要将 holleriths 声明为整数或隐式类型是否有效。(事实上​​,如果它们根本没有被声明为类型,那可能是你的问题,g77 可能需要将它们声明为整数)

在任何情况下,这正是您的错误的原因,如果您想将 BLANK 更改为一个字符,您需要将其从 Holerith 数据语句中删除。(除类型问题外,一个符号不能出现在同一程序单元的两个 DATA 语句中)。真的,如果你想走这条路,你应该改变所有这些,在这种情况下,你会有类似的东西:

  character*1 EYE/'I'/, BLANK/' '/, DASH/'-'/, PLUS/'+'/, SYMBOL/'*'/

我不确定在代码中使用它们的地方需要进行哪些(如果有的话)语法更改,但我猜你应该准备好着手更改整个代码中的每个 hollerith,因为混合它们可能会带来麻烦。

至少您需要将 ARRAY 声明为字符: character*1 array(22,54)

编辑 - -

对此进行了测试--- g77 不在乎您是否/如何键入声明 holleriths。实数、整数、双精度、字符或隐含的工作方式相同。较新的 gfortran 也适用于任何类型,但带有关于类型转换的警告。gfortran 实际上更喜欢您将它们声明为正确长度的字符...(也就是说,使用 char 声明您会收到更少的警告)

这表明,作为第一遍,您可以将所有常量声明为字符,即。

  character*1 EYE, BLANK, DASH, PLUS, SYMBOL
  DATA EYE, BLANK, DASH, PLUS, SYMBOL/1HI,1H ,1H-,1H+,1H*/

然后着手升级到现代字符语法。

于 2013-10-17T12:48:48.373 回答
0

您初始化 BLANK 两次(在第 1209 行和第 2727 行之后),这当然是不允许的。

于 2013-10-18T12:53:13.447 回答