"DATA INT / 'STRING' /" проблема при компиляции с gfortran

У меня есть старый (~1995 г.) устаревший код на языке Fortran, который скомпилирован с помощью компилятора g77 и не работает на gfortran. Проблема заключается в следующих строках (преобразование несовместимых типов, символ в целое число):

INTEGER  CKYAN
DATA     CKYAN / 'KYAN' /

Переменная CKYAN используется только один раз как триггер:

IF(IWVTX.EQ.CKYAN)THEN
    CALL FDCVERTEXSWITCHTOKYAN()
ENDIF

Целое число IWVTX читается из входного файла (строка "KYAN" или какая-либо другая строка).

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

  INTEGER it,ita,it1,it2,it3,it4,it5,it6
  DATA it  / 'KYAN' /
  DATA ita / 'KYAN' /
  DATA it1 / 'K' /
  DATA it2 / 'Y' /
  DATA it3 / 'A' /
  DATA it4 / 'N' /
  DATA it5 / 'O' /
  DATA it6 / 'o' /
  write(*,*) 'test', it, ita, it1, it2, it3, it4, it5, it6

производит вывод:

1312905547 1312905547 538976331 538976345 538976321 538976334 538976335 538976367

Таким образом, если строки равны, числа также равны. Если одна буква идет рядом с другой, ее код увеличивается на 1.

Вопросы следующие:

  1. Что здесь происходит?
  2. Есть ли функция, которая делает то же самое и доступно gfortran?
  3. Или есть простой способ исправить это, не затрагивая другие файлы?

Кто-нибудь может мне помочь с этим? Заранее спасибо.

1 ответ

Решение

Ух ты - а это было написано в 1995 году? Eep.

Насколько я могу судить, это в основном кодирование по Холлериту, кодирование символьных констант в целых числах (еще до того, как появился тип данных CHARACTER). В качестве быстрого теста, установка одного из этих целых чисел равным 4HKYAN, похоже, дает тот же ответ.

Причина этого здесь, похоже, заключается в том, чтобы установить флаг, равный некоторой константе, с которой потом можно будет проверить. Если вы хотите сделать то же самое, современный способ сделать это ckyan = transfer('KYAN',ckyan), который принимает битовое представление символьной строки, преобразует ее в формат переменной, переданной в качестве второго параметра, и возвращает ее.

Но здесь, похоже, что значение именованной константы не является критическим, если значения, которые IWVTX может принимать для разных случаев, различны...

Кстати, вы, возможно, уже знаете об этом, но в Fortran Wiki есть очень удобная страница по Модернизации Старого Фортрана; он не охватывает все (как этот, который я раньше не видел в такой форме), но он помогает перевести множество старых нестандартных конструкций в современный фортран.

Другие вопросы по тегам