"DATA INT / 'STRING' /" проблема при компиляции с gfortran - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть старый (~ 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 Ответ

2 голосов
/ 18 апреля 2011

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

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

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

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

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

...