Различия в операторах Compaq Visual Fortran и gfortran FORMAT

У меня есть огромный кусок кода 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 делает что-то другое.


person Andriy Kashchynets    schedule 18.04.2013    source источник
comment
на ваш общий вопрос могут быть различия из-за нестандартных спецификаторов редактирования. Хотя X и A являются стандартными. Можете ли вы объяснить лучше, что делает оригинальное приложение?   -  person agentp    schedule 19.04.2013
comment
Покажите сопровождающий оператор READ. Ввод с помощью символов табуляции может вызвать путаницу. Какие исправления вам пришлось внести, чтобы код компилировался с помощью gfortran?   -  person IanH    schedule 19.04.2013
comment
@george Есть файл данных со столбцами слов. Столбцы разделены пробелами. Пробелы также используются для выравнивания слов в столбцах. Как правило, программа не читает всю строку или даже целые слова (слова используются для того, чтобы сделать файл удобочитаемым для человека, и приложение читает только буквы в некоторых столбцах, чтобы понять данные; а также целые слова в других столбцах). Таким образом, исходное приложение считывает эти данные, а затем манипулирует ими (но манипуляции не интересны - я напечатал только что прочитанные данные, и это было не то, что ожидалось).   -  person Andriy Kashchynets    schedule 19.04.2013
comment
@IanH 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.2013
comment
(Лучше всего отредактировать ваш вопрос с запрошенной дополнительной информацией, а не добавлять ее в комментарии.) Покажите текст типичной читаемой строки, покажите значения переменных, считанные cvf и gfortran.   -  person IanH    schedule 19.04.2013
comment
@IanH О, спасибо. Я отредактировал.   -  person Andriy Kashchynets    schedule 19.04.2013
comment
Что делает загадочную вещь, которую мы не можем понять, правильной? Как измеряются переменные?   -  person agentp    schedule 19.04.2013
comment
@george Тот факт, что эти конкретные символы хранят информацию, необходимую в данный момент, делает ее правильной. Я имею в виду, что нет необходимости понимать, просто известно, что правильно. В любом случае, это просто пример ввода. И обновлено, чтобы ответить на второй вопрос.   -  person Andriy Kashchynets    schedule 19.04.2013
comment
ваш исходный код просто глючит. Если вы знаете, что он должен делать, просто напишите новый правильный код. Если вы не можете понять, что это должно делать, я не понимаю, как вы можете знать, что это правильно.   -  person agentp    schedule 19.04.2013
comment
@george Если вы уверены, что для CVF и gfortran нет различий в строках кода, которые я разместил, опубликуйте это как ответ, и я отправлю его и продолжу попытки найти волшебство где-то еще в коде. Я был уверен, что это происходит здесь.   -  person Andriy Kashchynets    schedule 19.04.2013
comment
Интерпретация оператора format с помощью gfortran кажется мне правильной, несмотря на то, что прочитанные значения отличаются от ожидаемых.   -  person M. S. B.    schedule 20.04.2013


Ответы (1)


Если бы это было бумажное упражнение и меня спросили, какими будут значения VAR1, VAR2 и VAR3, я бы дал тот же результат, что и gfortran.

То, что вы говорите, действительно странно. Я только что попробовал это на PowerStation4, IVF7 (версии до и после CVF6.6), и все они дают тот же результат, что и gfortran. Я также пробовал это с другим выравниванием слов и разными типами данных (недопустимо с gfortran, но вы можете сделать это на старых компиляторах), и он дает тот же ответ.

Вы уверены, что он читает файл, который, по вашему мнению, он читает. powerstation и некоторые версии cvf имеют проблему с именем файла 8.3. Они не могли справиться с длинными именами файлов.

person cup    schedule 21.04.2013
comment
› Я только что попробовал [...] и все они дают тот же результат, что и gfortran. Я уже пробовал это на CVF6.6, и это дало тот же результат, что и gfortran. Я сейчас совсем озадачен. В любом случае, спасибо за ответ - теперь я уверен, что FORMAT не является причиной странных вещей. С именем файла все ок, кстати, оно 8.3. - person Andriy Kashchynets; 21.04.2013