Вопрос: Как я могу прочитать переменные из строки с помощью пользовательского FORMAT времени выполнения и сохранить соответствующую двоичную версию переменных в символьном буфере, где типы происходят из формата?
Эквивалентный вопрос: Как преобразовать отформатированную строку с пользовательским FORMAT времени выполнения в строку, содержащую соответствующее битовое представление соответствующих типов, определенных форматом?
По сути, у нас есть программа, которая выполняет простую обработку. Шаги:
- Чтение строки из файла
- Чтение пользовательского формата из файла
- Обработка строки в формате и сохранение всех переменных в символьном буфере (в двоичном виде)
- Продолжить программу
Упрощенная программа будет:
program test
implicit none
character(len=16) :: string
character(len=32) :: fmt
character(len=8) :: buf1, buf2, buf3
string = 'ABC 12 3.4'
fmt = '(A3,1X,I2,1X,F4.1)'
read(string,fmt) buf1,buf2,buf3
write(*,'(A3,A4,A8)') buf1,buf2,buf3
end program
Пример выходных данных, проанализированных od
, может быть:
$ ./a.out | od -t x1
0000000 41 42 43 0c 00 00 00 33 33 33 33 33 33 0b 40 0a
0000020
Этот вывод, очевидно, зависит от системы. В этом случае предполагается, что числа с плавающей запятой являются числами с плавающей запятой IEEE, а система работает с прямым порядком байтов.
Последовательность 41 42 43
представляет ABC
, последовательность 0c 00 00 00
представляет 12, а 33 33 33 33 33 33 0b 40 0a
является ближайшим представлением двойной точности к числу 3.4.
Приведенная выше программа компилируется и работает нормально с использованием компилятора SolarisStudio Fortran f90
с использованием флагов -f77=input
.
$ f90 -f77=input file.f90
Однако ясно, что это не стандартный Фортран. Формат чтения и переменные должны соответствовать типу. Компилятор GNU быстро подавляется этим:
$ gfortran file.f90
$ ./a.out
At line 10 of file read_string.f90
Fortran runtime error: Expected INTEGER for item 2 in formatted transfer, got CHARACTER
(A3,1X,I2,1X,F4.1)
Есть ли "простой" способ преобразовать это в стандартный Fortran или заставить его работать в других компиляторах, таких как компиляторы GNU / Intel / PGI Fortran?