"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.
Вопросы следующие:
- Что здесь происходит?
- Есть ли функция, которая делает то же самое и доступно gfortran?
- Или есть простой способ исправить это, не затрагивая другие файлы?
Кто-нибудь может мне помочь с этим? Заранее спасибо.
1 ответ
Ух ты - а это было написано в 1995 году? Eep.
Насколько я могу судить, это в основном кодирование по Холлериту, кодирование символьных констант в целых числах (еще до того, как появился тип данных CHARACTER). В качестве быстрого теста, установка одного из этих целых чисел равным 4HKYAN, похоже, дает тот же ответ.
Причина этого здесь, похоже, заключается в том, чтобы установить флаг, равный некоторой константе, с которой потом можно будет проверить. Если вы хотите сделать то же самое, современный способ сделать это ckyan = transfer('KYAN',ckyan)
, который принимает битовое представление символьной строки, преобразует ее в формат переменной, переданной в качестве второго параметра, и возвращает ее.
Но здесь, похоже, что значение именованной константы не является критическим, если значения, которые IWVTX может принимать для разных случаев, различны...
Кстати, вы, возможно, уже знаете об этом, но в Fortran Wiki есть очень удобная страница по Модернизации Старого Фортрана; он не охватывает все (как этот, который я раньше не видел в такой форме), но он помогает перевести множество старых нестандартных конструкций в современный фортран.