2015-03-17 3 views
1

Как получить смещение в байтах для компонента записи?Атрибут позиции для смещения компонента записи

От Ada Programming/Attributes/'Position

«Позиция является атрибутом записи компонента типа. Он представляет смещение адреса компонента с начала записи. Возвращаемое значение представлено в единицах хранения, которые зависят от машины.

Компиляция этот код:

with Ada.Integer_Text_IO; 
use Ada.Integer_Text_IO; 
procedure Main is 
    type R is record 
     I : Integer; 
     F : Float; 
    end record; 
begin 
    Put(R.I'Position); --9 
    Put(R.F'Position); --10 
end; 

результаты в:

main.adb:9:08: invalid prefix in selected component "R" 
main.adb:10:08: invalid prefix in selected component "R" 

Я не знаю, почему я не могу компилировать что?

  • Смещение R.I должно быть .
  • Смещение для R.F должно быть Integer'Size/Storage_Unit.

Например, см. Документацию на C++ offsetof.

ответ

2

Если вы смотрите в справочном руководстве (RM 13.5.2), вы увидите, что R.C'Position определяется

Для компонента С композитной, не являющийся массивом объектов R

, что означает он не будет работать для типа, как в вашем коде. Вам необходимо создать переменную:

Foo : R; 
begin 
    Put(Foo.I'Position); --9 
    Put(Foo.F'Position); --10 

Так что пример в wikibook кажется неправильным.

+0

Создает ли переменную с целью получения смещения: выделяет память? – Jossi

+0

В этом случае он зарезервирует место в стеке. – egilhh

+1

Вы можете использовать блок объявления; хранилище должно быть освобождено при выходе из блока. –

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