Проблема компиляции Fortran с g77

Я пытаюсь скомпилировать старый код Fortran, используемый на моей работе с g77. Я новичок в Fortran и вообще в программировании, и я пытаюсь разобраться со всеми ошибками. Это тот, который возвращает g77:

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

Если я правильно понимаю, это связано с константой Холлерита, используемой в приведенных ниже фрагментах кода:

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 операторами Character и т. Д., Но я думаю, что что-то упускаю. Я был бы признателен за любые предложения о том, как действовать.

РЕДАКТИРОВАТЬ---

 1209  DATA BLANK /'    '/

является частью подпрограммы под названием «SW», которая рассчитывает водообеспеченность почвы. BLANK затем инициализируется в графической подпрограмме 'plot'.


person Cfree    schedule 17.10.2013    source источник
comment
Можете ли вы определить тип BLANK - появляется ли он в операторе объявления типа в соответствующем программном модуле (подпрограмме/функции и т. д.) или появляется неявный оператор в начале соответствующего программного модуля? (Вы показываете фрагменты из той же программной единицы?) Знаете ли вы, что для вашего кода требуется g77? Если нет, вам может быть лучше использовать gfortran (который активно поддерживается), а не g77.   -  person IanH    schedule 17.10.2013
comment
Символы, появляющиеся в разных подпрограммах, вообще связаны друг с другом, если у вас нет других вещей, таких как общие операторы или символы, появляющиеся в качестве аргументов подпрограммы. Я думаю, вам просто нужно объявить charater * 4 пустым в подпрограмме sw.   -  person agentp    schedule 21.10.2013


Ответы (2)


если это поможет, этот блок данных инициализирует каждый из глаз, пробела, тире, плюса и символа для одного символа hollerith:

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

эквивалентно (и ИМО предпочтительнее для удобочитаемости),

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

Даже я недостаточно взрослый, чтобы помнить, нужно ли объявлять холлериты целыми или работает ли неявная типизация. (Действительно, это может быть вашей проблемой, если они вообще не объявлены типом, g77 может потребовать, чтобы они были объявлены целыми числами)

В любом случае именно это является причиной вашей ошибки, если вы хотите изменить BLANK на символ, вам нужно удалить его из оператора данных холерита. (Помимо проблем с типом, символ не может появляться в двух операторах DATA в одном и том же программном модуле). Действительно, если вы хотите пойти по этому пути, вы должны изменить их все, и в этом случае у вас будет что-то вроде:

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

Я не уверен, какие (если вообще нужны) изменения синтаксиса требуются там, где они используются в коде, но я предполагаю, что вы должны быть готовы изменить каждый холлерит во всем коде, поскольку их смешивание, вероятно, вызовет проблемы.

По крайней мере, вам нужно объявить МАССИВ как символ: массив символов * 1 (22,54)

РЕДАКТИРОВАТЬ---

проверил это --- g77 не заботится о том, как вы вводите объявление холлеритов. действительное, целое число, двойная точность, символ или неявное работают точно так же. более новый gfortran также работает с любым типом, но с предупреждениями о преобразовании типов. gfortran на самом деле предпочитает объявлять их как символы правильной длины... (то есть вы получаете меньше предупреждений с объявлением char)

Это предполагает, что в качестве первого прохода вы можете объявить все свои константы как символы, т.е.

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

затем приступайте к обновлению до современного синтаксиса символов.

person agentp    schedule 17.10.2013

Вы инициализируете BLANK дважды (в строке 1209 и сразу после строки 2727), и это, конечно, не разрешено.

person ddpmanik    schedule 18.10.2013
comment
Мой WAG эти фрагменты кода на самом деле находятся в разных подпрограммах. Крейг должен вернуться с дополнительным кодом контекста, если у него все еще есть проблемы. - person agentp; 18.10.2013