Hi Kevan,

>      huge : Integer := 128_000_000;

> Here the size of the array is predefined with a constant "huge".

No. "huge" is a variable that is initialised to 128,000,000. The memory is allocated dynamicly and it is allocated from the heap (the main memory pool).

Perhaps this is a better example for what you want

with Ada.Text_IO;  use Ada.Text_IO;
with Ada.Unchecked_Deallocation;

procedure Foo is

   package Integer_IO is new Ada.Text_IO.Integer_IO (Integer);  use Integer_IO;

   type vector     is array (Integer range <>) of Float;
   type vector_ptr is access vector;
   procedure Free_Vector is new Ada.Unchecked_Deallocation (vector, vector_ptr);

   num : Integer;

begin

   get (num);  -- read the size of the array from standard input

   declare

      xg_ptr : vector_ptr := new vector (0..num);
      xg     : vector renames xg_ptr.all;

   begin
      Put (xg'last);
      New_line;
      Free_Vector (xg_ptr);  -- essential to avoid memory leaks
   end;

end Foo;

And another example,

with Ada.Text_IO;  use Ada.Text_IO;
with Ada.Unchecked_Deallocation;

procedure Foo is

   package Integer_IO is new Ada.Text_IO.Integer_IO (Integer);  use Integer_IO;

   type vector     is array (Integer range <>) of Float;
   type vector_ptr is access vector;
   procedure Free_Vector is new Ada.Unchecked_Deallocation (vector, vector_ptr);

   min, max : Integer;

   procedure bahbah (min,max : Integer) is
      xg_ptr : vector_ptr := new vector (min..max); -- min, max unknown at compile time
      xg     : vector renames xg_ptr.all;
   begin

      Put (xg'last);
      New_line;
      Free_Vector (xg_ptr);  -- essential to avoid memory leaks

   end bahbah;

begin

   get (min);
   get (max);

   bahbah (min,max);

end Foo;

Cheers,
Leo


On 6 January 2017 at 04:39, Kevan Hashemi <hashemi@brandeis.edu> wrote:
Leo: Thank you for your code example.

   for i in 10 .. 20 loop
      -- create xg on the stack (okay but stack size is limited)
      -- xg exists only within this declare block
      declare
         xg : Array (0..i-1) of Float;
      begin
         Put (xg'last);
         New_line;
      end;
   end loop;

That's the dynamic allocation I'm looking for, except it's on the stack. I need to use the main memory for dynamic allocation.

      huge : Integer := 128_000_000;
      xg_ptr : vector_ptr := new vector (0..huge);
      xg     : vector renames xg_ptr.all;
   begin
      Put (xg'last);
      New_line;
      Free_Vector (xg_ptr);  -- essential to avoid memory leaks
   end;

Here the size of the array is predefined with a constant "huge".

Bastiaan: Thanks for the link. In the linked code we have:

>   VA     := new Vector (1 .. 10);
>   VB     := VA;  -- points to the same location as VA

Here, the vector size is predefined with the constants 1 and 10.

Peter: Thank you for your FPC example, which does exactly what I need.

> program A;
> type
> graph_type = array of real;
> var
>   xg:graph_type;
>   i:integer;
> begin
>   for i:=100 to 200 do
>   begin
>     setlength(xg,i);
>     xg := nil;
>   end;
> end.

Somehow, I missed setlength when I looked into FPC, and when I asked the FPC group about dynamic arrays, they must have interpreted my question as "does FPC support exactly the same syntax as GPC". So it looks like I could switch to FPC with minimal work.


Yours, Kevan


--
Kevan Hashemi, Electrical Engineer
Physics Department, Brandeis University
http://alignment.hep.brandeis.edu/