Понимание того, как Ada сериализует запись
-
01-07-2019 - |
Вопрос
Я хотел бы иметь возможность предсказать, что будет в результирующем двоичном файле, когда я вызову Write в Ada для сериализации записи.Вы не знаете, где я могу это посмотреть?
У меня есть устаревшее программное обеспечение Ada, которое создает двоичный файл путем записи записи, и мне нужно отладить программу на C ++, которая должна записать совместимый двоичный файл.Итак, я хотел бы понять, каким правилам следует Ada при сериализации записи, чтобы я мог убедиться, что код C ++ создаст функционально эквивалентную запись.
Решение
Как упоминалось другими, без дополнительных инструкций компилятор будет принимать свои собственные решения о расположении записи.Лучшим подходом было бы изменить исходный код для записи записи с использованием определенного макета.В частности, предложение о представлении записи позволяет программисту Ada точно указать физический формат записи.На самом деле, вам следует проверить, есть ли в исходном коде что-то из этого для рассматриваемого типа.Если это так, то это было бы точным ответом на ваш вопрос.
Другие советы
Формат сериализованного вывода 'Write имеет абсолютно ничего что касается предложений о представлении.
По умолчанию компилятор будет выводить компоненты записи без заполнения выравнивания в том порядке, в котором они записаны в объявлении записи, используя схему перевода, которая не определена стандартом (поэтому вы можете не добиться совместимости между компиляторами).GNAT (компилятор Ada GCC) выводит каждый компонент в виде целого числа байт.
Если вы хотите передавать значения типа в потоковом режиме, используя какой-то другой формат, вы можете переопределить 'Write для этого типа.В качестве необычного примера вы могли бы выполнить потоковую передачу в формате XML.
По сути, компилятор изменит порядок компонентов ваших типов записей, если только вы не используете команды pragma PACK или pragma PRESERVE_LAYOUT для ваших типов записей.Кроме того, компилятор дополнит объекты, чтобы поддерживать выравнивание компонентов записи.Компоненты следуют:
Целое число:8, 16 или 32-битные двойки - дополняющие числа со знаком
Плавать:32-разрядный формат IEEE
Длинное_плавание:64-разрядный формат IEEE
Фиксированная точка:8, 16 или 32 бит;однако указанный диапазон и дельта могут влиять на значение 16 или 32
Перечисления:Целое число, обычно первый элемент представлен символом 0
Логические значения:Объект перечисления длиной 8 бит, LSB хранит значение:0 = ложь, 1 = истина
Персонажи:Объект перечисления длиной 8 бит, без знака от 0 до 127
Типы доступа:32 бита, 32-битное значение 0 представляет собой NULL
Массивы:хранятся последовательно в порядке следования строк, размер зависит от базового типа.Массив дополнен, чтобы гарантировать, что все элементы имеют правильное выравнивание в соответствии со своими типами.
Тот Самый Справочное руководство по языку Ada95 гласит (раздел 13.13.2):
"Для элементарных типов представление в терминах элементов потока определяется реализацией.Для составных типов атрибут Write или Read для каждого компонента вызывается в каноническом порядке.Канонический порядок компонентов - это последнее измерение, изменяющееся быстрее всего для массива, и позиционный агрегированный порядок для записи. "