Вопрос

Я хотел бы иметь возможность предсказать, что будет в результирующем двоичном файле, когда я вызову 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 для каждого компонента вызывается в каноническом порядке.Канонический порядок компонентов - это последнее измерение, изменяющееся быстрее всего для массива, и позиционный агрегированный порядок для записи. "

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top