comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen.leake@gsfc.nasa.gov>
Subject: Re: Variable-length arrays (from a C programmer)
Date: 1998/04/24
Date: 1998-04-24T00:00:00+00:00	[thread overview]
Message-ID: <3540BF46.6D61@gsfc.nasa.gov> (raw)
In-Reply-To: 353F9B75.3019A7A4@AlliedSignal.com


Paul T. McAlister wrote:
> 
> I have an application where I will be displaying a number of different
> screens full of text messages.
> I want these messages and screens to be data table driven.
> 
> In "C" (see example), I can define an array of messages for each page,
> then define an array of pages for the whole thing.
> I don't have to worry about string length or number of items defined in
> the arrays, the compiler handles all of that for me.
> 
> I have not been able to figure out how to do the equivalent thing in
> Ada.
> I don't know how to define strings without setting the length to the
> maximum length string I will have, which wastes a lot of space.
> I think I know how to define the variable length arrays for the messages
> for each screen, but I don't know how to define an array type of these
> arrays of string for each page (since they are different types because
> they are different lengths).
> I am using Ada83.
> 
> I know this is a lengthy question, but any help would be greatly
> appreciated.

Here's one way. It allocates the strings at elaboration time. Note that
Ada can determine the size of an array from its initializer (like a C
string, but unlike a C array).

with Ada.Text_IO; use Ada.Text_IO;
procedure Test is
-- structure for each page
   type String_Ptr is access String;

   type Msg_Struct is record
      Text : String_ptr;   -- pointer to message text
      XPos : integer;   -- x position on screen
      YPos : integer;   -- y position on screen
   end record;

   type Msg_Struct_Array is array (Integer range <> ) of Msg_Struct;
   type Msg_Struct_Array_Ptr is access Msg_Struct_Array;
   type Page_Struct is array (Integer range <> ) of
Msg_Struct_Array_ptr;

   Pages : constant Page_Struct :=
      (-- page 1 messages
       new Msg_Struct_Array'
       ((new String'("Greetings Earthling"), 0, 0),
        (new String'("Take me to your leader"), 1, 0)),

       -- page 2 messages
       new Msg_Struct_Array'
       ((new String'("Screen 2"), 0, 0),
        (new String'("This text is some lines farther down"), 5, 0),
        (new String'("and this is even FARTHER down"), 10, 0)),

       -- page 3 messages
       new Msg_Struct_Array'
       ((new String'("This is the third screen"), 0, 0),
        (new String'("and by now you should be getting"), 1, 10),
        (new String'("the point of what it is"), 2, 12),
        (new String'("I am trying to do!!"), 3, 14))
       );

  IPage : integer;
  IMsg : integer;
  NPage : integer;
begin
  -- find number of pages
  nPage := Pages'length;

  -- for each page
  for iPage in Pages'range loop
    New_Line;   -- put blank line between pages

    -- for each message
    for iMsg in Pages(IPage)'Range loop
      Put (Pages(IPage).all(IMsg).Text.all);  -- print message
      New_Line;                               -- terminate line
    end loop;
  end loop;
end Test;

This allocates everything at elaboration time; a smart compiler could do
it at compile or link time. To get closer to the C semantics (no
explicit allocation), you have to introduce more Ada names:

Page1_Message1 : constant aliased String := "Greetings Earthling";

Message1 : aliased Msg_Struct := (Page1_Message1'access, 0, 0);

etc.

-- Stephe




  parent reply	other threads:[~1998-04-24  0:00 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-04-23  0:00 Variable-length arrays (from a C programmer) Paul T. McAlister
1998-04-24  0:00 ` Stephen Leake
1998-04-24  0:00 ` Anonymous
1998-04-24  0:00 ` Stephen Leake [this message]
1998-04-28  0:00 ` Matthew Heaney
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox