Преобразование отформатированной символьной строки в неформатированную символьную строку с пользовательским форматом времени выполнения - PullRequest
0 голосов
/ 01 июля 2019

Вопрос: Как я могу прочитать переменные из строки с помощью пользовательского FORMAT времени выполнения и сохранить соответствующую двоичную версию переменных в символьном буфере, где типы происходят из формата?

Эквивалентный вопрос: Как преобразовать отформатированную строку с пользовательским FORMAT времени выполнения в строку, содержащую соответствующее битовое представление соответствующих типов, определенных форматом?

По сути, у нас есть программа, которая выполняет простую обработку. Шаги:

  1. Чтение строки из файла
  2. Чтение пользовательского формата из файла
  3. Обработка строки в формате и сохранение всех переменных в символьном буфере (в двоичном виде)
  4. Продолжить программу

Упрощенная программа будет:

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...