Validity-Проверка на логические значения при чтении из неформатированного двоичного файла - PullRequest
0 голосов
/ 01 марта 2019

Я прочитал неформатированный двоичный файл контрольных точек с помощью fortran, и мне нужно проверить значения на их достоверность.Весь смысл контрольной точки состоит в том, что произошел некоторый сбой, и сам файл контрольной точки мог быть поврежден (например, если сбой произошел во время записи файла).

Итак, мой вопрос: существует ли стандартная процедура дляпроверьте, правильно ли логические значения, считанные из файла, были сохранены как логические значения.

Короткий тест с записью любого числа вместо логического и чтением его дал мне .false.значение.Я предполагаю, что каждое читаемое число будет преобразовано в соответствии с правилом, подобным C: nr == 0 ->. False.nr! = 0 -> .true .. Это, однако, не помогает мне понять, правильно ли была написана логика.

Что я могу себе представить, так это читать значение как целое число (или какое-то двоичное значение?)сначала и проверяя, являются ли они 0 или 1, указывая на правильное написание логического.

Пример:

write_test.f90:

program write_test
logical,parameter :: bool=.true.
real*8,parameter :: r=5e20
open(unit=10,form='unformatted')
write(10)bool,r
close(10)
end program

read_test.f90:

program read_test
logical :: bool1
logical :: bool2
open(unit=10,form='unformatted')
read(10)bool1,bool2
write(*,*)bool1,bool2
end program

Вывод read_test.f90:

T F

bool2 выглядит так, как если бы это была хорошая логика со значением .false., Но оно было сохранено как действительное,которого я хотел бы избежать, равно как и всех других типов данных, которые могут быть там выброшены.

По-видимому, он также не использует .true.для значений, отличных от 0. Я предполагаю, что ведущий бит реального, который хранится там, равен 0, и он только читает этот единственный бит.

1 Ответ

0 голосов
/ 01 марта 2019

Возможно, это расширенный комментарий, а не ответ:

Вы ошибаетесь, если предполагаете, что каждое прочитанное число будет преобразовано в соответствии с правилом, подобным C: nr == 0 ->.ложный.nr! = 0 -> .true. или, по крайней мере, ваше предположение не гарантируется в соответствии с правилами стандарта Fortran.В нем ничего не говорится о битовых шаблонах, используемых для представления True и False, в частности, он не требует, чтобы они были такими же, как битовые комбинации, используемые для представления 0 и 1 (или 1 и 0 - я никогда не смогу получитьзависание от этих забавных языков, которые думают, что это булевы значения)возиться с ними) при записи в неформатированный файл.Это означает, среди прочего , что любые 32-битные (или 64, если это размер вашего хранилища по умолчанию) значения могут быть интерпретированы как вещественное, целое или логическое.

Некоторые избитовые комбинации не могут быть успешно интерпретированы как какие-либо или все из этих типов, но, опять же, это проблема реализации ниже уровня, на котором работает стандарт Фортрана.

Невозможно из одних бит узнать, какой тип значения представляет группа из 32 битов, где-то должно быть описание того, как интерпретировать двоичные файлы.Это то, что делает их довольно непереносимыми.

Если эти проблемы важны для вас, вам действительно нужно исследовать их самостоятельно, в частности, какие битовые шаблоны использует ваш компилятор (версия) для представления логических значений.Вы можете разумно ожидать (хотя это не является гарантией), что целые числа представлены в форме дополнения до двух и действительны в форме IEEE.

...