Понимание того, как Ада сериализует запись - PullRequest
4 голосов
/ 17 сентября 2008

Я хотел бы быть в состоянии предсказать, что будет в полученном двоичном файле, когда я вызову Write в Ada для сериализации записи. Вы знаете, где я могу это посмотреть?

У меня есть какое-то устаревшее программное обеспечение Ada, которое создает двоичный файл путем записи записи, и мне нужно отладить программу на C ++, которая должна писать совместимый двоичный файл. Итак, я хотел бы понять, каким правилам следует Ada при сериализации записи, чтобы я мог убедиться, что код C ++ будет создавать функционально эквивалентную запись.

Ответы [ 4 ]

4 голосов
/ 26 ноября 2008

Формат сериализованного вывода 'Write не имеет абсолютно никакого отношения к пунктам представления.

По умолчанию компилятор выводит компоненты записи без выравнивания выравнивания в том порядке, в котором они записаны в объявлении записи, используя схему перевода, которая не определена стандартом (поэтому вы можете не получить совместимость между компиляторами ). GNAT (компилятор GCC Ada) выводит каждый компонент целым числом байтов.

Если вы хотите передавать значения типа с использованием другого формата, вы можете переопределить «Запись» для типа. В качестве необычного примера вы можете выполнить потоковую передачу в XML.

3 голосов
/ 17 сентября 2008

По сути, компилятор будет переупорядочивать компоненты типов записей, если вы не используете команды pragma PACK или pragma PRESERVE_LAYOUT с типами записей. Кроме того, компилятор будет дополнять объекты, чтобы поддерживать выравнивание компонентов записи. Компоненты следуют:

Целое число: 8, 16 или 32-битные числа со знаком с двумя дополнениями

Число с плавающей запятой: 32-разрядный формат IEEE

Long_Float: 64-битный формат IEEE

Фиксированная точка: 8, 16 или 32 бита; однако указанный диапазон и дельта могут влиять на 16 или 32

Перечисления: целое число, обычно первый элемент представлен 0

Booleans: объект перечисления, длина 8 бит, LSB хранит значение: 0 = ложь, 1 = истина

Символы: объект перечисления, 8 бит длиной, без знака от 0 до 127

Типы доступа: 32 бита, 32-битное значение 0 представляет NULL

Массивы: хранятся смежно в главном порядке строк, размер зависит от базового типа. Массив дополняется, чтобы все элементы имели правильное выравнивание для своих типов.

2 голосов
/ 18 сентября 2008

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

1 голос
/ 17 сентября 2008

Справочное руководство по языку Ada95 говорит (раздел 13.13.2):

"Для элементарных типов представление в терминах элементов потока определяется реализацией. Для составных типов атрибут« Запись »или« Чтение »для каждого компонента вызывается в каноническом порядке. Канонический порядок компонентов - последнее измерение, изменяющееся наиболее быстро массив и позиционный агрегатный порядок для записи. "

...