2016-08-23 11 views
1

У меня есть тип записи следующим образом:Ada запись представление

type Rec_T is record 
    a : Bit_12_T; 
    b : Bit_4_T; 
end record; 

где Bit_12_T is mod 2**12 и Bit_4_T is mod 2**4.

Чтобы сообщить компилятору о точном выравнивании этой записи, я использую инструкцию for use record. Тем не менее, я хочу, чтобы разделить a поле bewteen байтов, поэтому я пытаюсь сделать это следующим образом:

for Rec_T use record 
    a at 0 range 0 .. 7; -- The 1st byte 
    a at 1 range 0 .. 3; -- The 2nd byte 
    b at 1 range 4 .. 7; 
end record; 

Очевидно, что это не способ сделать это, как компилятор жалуется, что «положение компонента ранее дано на линии ... ».

Вопрос: Возможно ли разделение компонента между байтами и как это сделать? Если это невозможно, должен ли я иметь a_high и a_low, а затем использовать некоторые битовые операции для их объединения?

ответ

2

Подумайте о местоположении как массиве бит, а не о последовательности байтов. Следовательно, это должно работать:

for Rec_T use record 
    a at 0 range 0 .. 11; -- bits 0..7 of the 1st byte and bits 0..3 of the 2nd byte 
    b at 0 range 12 .. 15; -- bits 4..7 of the second byte 
end record; 
for Rec_T'Size use 16; 

Для получения дополнительной информации см documentation here, в частности в качестве примера в то конец страницы, которая показывает подобную ситуацию.

+0

Благодарим за предложение. Я уже рассмотрел этот пример; однако он показывает только, как выровнять различные поля в байтах, а не как разделить одно поле между байтами. – NeoSer

+2

@NeoSer Снова прочитайте документы. Нет ограничений относительно 'first_bit' и' last_bit', принадлежащих к одному и тому же байту. Подумайте о базовом хранилище как длинном последовательном массиве бит. –

+1

Ondrej, не должно быть 'для Rec_T'Size использовать 16;'? –