2016-12-02 3 views
1

Каков правильный синтаксис инициализации динамически распределенного массива в Ada? Я пробовал:Ada Синтаксис для инициализации динамически распределенного массива

type Short_Array is array (Natural range <>) of Short; 
Items : access Short_Array; 
Items := new Short_Array(1..UpperBound)'(others => 0); 

, что приводит к ошибке компилятора - ожидается «двоичный оператор». И это:

type Short_Array is array (Natural range <>) of Short; 
Items : access Short_Array; 
Items := new Short_Array(1..UpperBound); 
Items.all := (others => 0); 

, который, кажется, поднимет SEGFAULT на удивление. Не уверен, что там происходит, но хотел получить синтаксис, прежде чем я начну преследовать свой хвост.

+0

Почему вы динамически выделяете массив? –

+0

Ваша вторая версия отлично работает здесь, macOS, GNAT GPL 2015/2016. Какой OS/компилятор вы используете? –

+0

@JimRogers Это часть типа записи, которую я не знаю во время компиляции. –

ответ

5

Если вы используете Ada2012 вы можете сделать следующее:

type Short_Array is array(Natural range <>) of Short with 
    Default_Component_Value => 0; 
Items : access Short_Array := new Short_Array(1..UpperBound); 

Использование исходных значений по умолчанию для массивов объясняется в разделе 2.6 Ada 2012 Обоснование http://www.ada-auth.org/standards/12rat/html/Rat12-2-6.html

+0

Работает отлично. Благодаря! –

3

Другой подход в Ада для определения записи как дискриминантной записи с дискриминантом, определяющим размер поля массива.

type Items_Record (Size : Natural) is record 
    -- Some non-array fields of your record 
    Items : Short_Array(1..Size); 
end record; 

Экземпляр записи могут быть выделены во внутреннем блоке

Get(Items_Size); 
declare 
    My_Record : Items_Record(Size => Items_Size); 
begin 
    -- Process the instance of Items_Record 
end; 

Запись динамически выделяется в стеке. Если размер записи очень велик, вы столкнулись с проблемой переполнения стека. Если нет, это работает очень хорошо. Одним из преимуществ этого подхода является то, что экземпляр автоматически де-распределяется, когда достигнут конец блока.

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