У меня есть огромный кусок кода Fortran, и я хочу скомпилировать этот код с помощью gfortran. Раньше я не работал с Фортраном. Я не знаю точно, какой спецификации код, но я выяснил, что он может быть скомпилирован как минимум с помощью Compaq Visual Fortran 6.6 - так что я могу предположить, что он был написан под него.
Общий вопрос: Существует ли автоматический транслятор Compaq Visual Fortran в gfortran? Я не нашел ни одного.
На самом деле код компилируется с помощью gfortran после некоторых исправлений, но во время выполнения ведет себя неправильно: он не читает входные файлы, как ожидалось. Вот пример кода:
CHARACTER*6 VAR1
CHARACTER*1 VAR2
CHARACTER*3 VAR3
OPEN (UNIT=CHANNEL, FILE=FILENAME, STATUS='OLD')
READ(CHANNEL, 38)VAR1,VAR2,VAR3
38 FORMAT(15X,A6,7X,A1,14X,A3)
И пример данных:
123456789012345------'1234567-'''''12345678901234---
.ABCDEF.GHI.JKLMNOPQR.STUVWX.YZABC.DEF.GHI.JKLM....P
123456789012345------1234567-12345678901234---
Первая строка - это то, как его читает исходное приложение, третья - gfortran, вторая - пример строки из файла данных (1
-9
для пропущенных символов, -
для чтения, '
для неуказанного по формату, .
в примере вместо пробелов в исходной строке).
Итак, результаты будут:
Origanal: VAR1 == 'MNOPQR', VAR2 == 'Y', VAR3 == '..P' - correct
gfortran: VAR1 == 'MNOPQR', VAR2 == '.', VAR3 == 'JKL' - wrong
gfortran довольно прост: он перескакивает через 15 символов, считывает 6, перескакивает через 7 и так далее. Но оригинальное приложение идет другим путем и я не могу угадать его логику. Он по-прежнему читает указанное количество символов, но переходит дальше, чем указано. И он действительно читает то, что он должен читать.
Я попытался указать точную длину, как она указана во входном файле (15X,A6,8X,A1,19X,A3
), и это работает для gfortran, но это не долгосрочное решение.
Итак, мой более конкретный вопрос: Есть ли какие-либо различия в операторе FORMAT
в gfortran и Compaq Visual Fortran 6.6? (возможно, я ошибаюсь, думая, что причиной является FORMAT
)
UPD
Я думаю, может быть что-то с разбиением на слова или около того. Я имею в виду, что gfortran просто считает символы, а CVF делает что-то другое.
OPEN (UNIT=CHANNEL, FILE=FILENAME, STATUS='OLD')
, а затемREAD(CHANNEL, 38)VAR1,VAR2,VAR3
. Исправления: 1) некоторые функции имеют тип возвратаINTEGER
, но используются какINTEGER*1
- сделали всеINTEGER
(всегда возвращают '1' или '0') и 2) одна функция конфликтует с какой-то стандартной функцией gfortran - изменено ее имя. Но я думаю, что эти исправления не могли повлиять на эту проблему, так как они появляются позже в работе приложения (приложение не может прочитать заголовок файла данных). - person Andriy Kashchynets   schedule 19.04.2013format
с помощью gfortran кажется мне правильной, несмотря на то, что прочитанные значения отличаются от ожидаемых. - person M. S. B.   schedule 20.04.2013