Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dynamic array size determined at runtime in ada

Is it possible to have an array with size that is determined at runtime like so,

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;

Is there a way to achieve this result other than using dynamically Linked Lists or another similar structure? Or is there a simple built in data structure that would be simpler than using dynamically linked lists?

like image 521
Shelby115 Avatar asked Dec 06 '12 00:12

Shelby115


2 Answers

Sure, declare it in a block as follows:

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;

or pass the arraySize as an argument into a subprogram and declare and operate on it in that subprogram:

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;

This is just illustrative (and not compiled :-), as you need to deal with things like an invalid array size and such.

like image 172
Marc C Avatar answered Sep 19 '22 10:09

Marc C


Yes, you can defer the declaration of a constrained object until you know the size. In this example, the array Candidates can be allocated in a nested block (introduced by the keyword declare) or on the heap (using the keyword new). In this related example, Line has a different size each time through the loop, depending on what Get_Line finds.

like image 28
trashgod Avatar answered Sep 18 '22 10:09

trashgod