размер динамического массива определяется во время выполнения в ada

Возможно ли иметь массив с размером, который определяется во время выполнения, например,

Procedure prog is
   type myArray is array(Integer range <>) of Float;
   arraySize : Integer := 0;
   theArray : myArray(0..arraySize);
Begin
   -- Get Array size from user.
   put_line("How big would you like the array?");
   get(arraySize);

   For I in 0..arraySize Loop
      theArray(I) := 1.2 * I;
   End Loop;
End prog;

Есть ли способ добиться этого результата, кроме использования динамически связанных списков или другой подобной структуры? Или есть простая встроенная структура данных, которая была бы проще, чем использование динамически связанных списков?


person Shelby115    schedule 06.12.2012    source источник


Ответы (2)


Конечно, объявите его в блоке следующим образом:

procedure prog is
   arraySize : Integer := 0;
   type myArray is array(Integer range <>) of Float;
begin
   -- Get Array size from user.
   put_line("How big would you like the array?");
   get(arraySize);

   declare
      theArray : myArray(0..arraySize);
   begin
      for I in 0..arraySize Loop
         theArray(I) := 1.2 * I;
      end Loop;
   end;
end prog;

или передать arraySize в качестве аргумента в подпрограмму и объявить и работать с ним в этой подпрограмме:

procedure Process_Array (arraySize : Integer) is

    theArray : myArray(0..arraySize);

begin
   for I in arraySize'Range Loop
      theArray(I) := 1.2 * I;
   end Loop;
end;

Это просто иллюстративно (а не скомпилировано :-), так как вам нужно иметь дело с такими вещами, как недопустимый размер массива и тому подобное.

person Marc C    schedule 06.12.2012
comment
Большое спасибо. Я совершенно не замечал, что ты можешь делать такие вещи. Хотя это имеет большой смысл, поскольку это в основном то, что вы делаете с функциями и программами, ха-ха. - person Shelby115; 06.12.2012

Да, вы можете отложить объявление ограниченного объекта, пока не узнаете размер. В этом примере массив Candidates может быть размещен во вложенном блоке (представленном ключевым словом declare) или в куче ( используя ключевое слово new). В этом связанном примере Line имеет разный размер каждый раз в цикле, в зависимости от того, что находит Get_Line.

person trashgod    schedule 06.12.2012