2008-09-17 12 views
3

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

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

+1

Если я не ошибаюсь, это самый первый вопрос Ады на Stackoverflow! Woohoo! – 2008-09-17 15:45:03

ответ

1

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

1

Ada95 Language Reference Manual говорит (раздел 13.13.2).

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

+0

Спасибо за ссылку. Я надеюсь, что кто-то написал немного более подробно на эту тему. – 2008-09-17 16:26:45

2

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

Целое число: 8, 16 или 32 бит дополнительном коде подписанные номера

Поплавок: 32-битный IEEE формат

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

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

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

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

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

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

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

3

Формат сериализованного выхода «Write» имеет абсолютно ничего делать с предложениями представления.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^