Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用77国集团编译Fortran时遇到的问题_Fortran_Fortran77_G77 - Fatal编程技术网

用77国集团编译Fortran时遇到的问题

用77国集团编译Fortran时遇到的问题,fortran,fortran77,g77,Fortran,Fortran77,G77,我正试图编译一些在77国集团工作时使用的旧Fortran代码。我是Fortran和编程新手,我正在努力克服所有的错误。这是77国集团正在返回的: afsirs.for: In subroutine `sw': afsirs.for:1209: DATA BLANK /' '/ ^ Type disagreement between expressions at (?) and (^) 如果我理解正确,这与下面代码片段中使用的Hollerith

我正试图编译一些在77国集团工作时使用的旧Fortran代码。我是Fortran和编程新手,我正在努力克服所有的错误。这是77国集团正在返回的:

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,等等,但我觉得我遗漏了一些东西。如能就如何进行提出任何建议,我将不胜感激

编辑---


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

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

  DATA EYE, BLANK, DASH, PLUS, SYMBOL/1HI,1H ,1H-,1H+,1H*/
同等(IMO优先考虑可读性)

即使我还没有足够大的年纪来记住holleriths是否需要声明为整数,或者隐式类型是否有效。(事实上,如果它们根本没有被声明为一种类型,这可能是你的问题,77国集团可能需要将它们声明为整数)

在任何情况下,这正是错误的原因,如果要将空格更改为字符,则需要将其从holerith data语句中删除。(同一程序单元中的两个数据语句中不能出现符号)。真的,如果你想沿着这条路走下去,你应该改变所有这些,在这种情况下,你会有如下结果:

  character*1 EYE/'I'/, BLANK/' '/, DASH/'-'/, PLUS/'+'/, SYMBOL/'*'/
我不确定在代码中使用它们的地方需要进行什么(如果有)语法更改,但我猜您应该准备开始更改整个代码中的每一个hollerith,因为混合使用它们可能会带来麻烦

至少需要将数组声明为字符: 字符*1数组(22,54)

编辑---

对此进行了测试---77国集团不在乎是否/如何输入和声明holleriths。实数、整数、双精度、字符或隐式都是一样的。 较新的gfortran也适用于任何类型,但有关于类型转换的警告。 gfortran实际上更喜欢将它们声明为正确长度的字符。。。(也就是说,通过char声明,您得到的警告更少)

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

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

然后开始升级到现代字符语法。

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

您是否能够确定空白的类型-它是否出现在相关程序单元(子程序/函数等)的类型声明语句中或者隐式语句出现在相关程序单元的开头?(您是否正在显示来自同一程序单元的代码片段?)?如果没有,您最好使用gfortran(它是主动维护的)而不是g77。出现在不同子例程中的符号确实相互关联,除非您有其他事情正在进行,例如公共语句或出现在子例程参数中的符号。我想你只需要在子例程sw中声明character*4为空。我的WAG那些代码片段实际上在不同的子例程中。如果Craig还有问题的话,他应该再来点上下文代码。
  character*1 EYE/'I'/, BLANK/' '/, DASH/'-'/, PLUS/'+'/, SYMBOL/'*'/
  character*1 EYE, BLANK, DASH, PLUS, SYMBOL
  DATA EYE, BLANK, DASH, PLUS, SYMBOL/1HI,1H ,1H-,1H+,1H*/