comp.lang.ada
 help / color / mirror / Atom feed
From: "DuckE" <nospam_steved94@home.com>
Subject: Re: C-style 'union' in Ada?
Date: Tue, 14 Aug 2001 03:09:55 GMT
Date: 2001-08-14T03:09:55+00:00	[thread overview]
Message-ID: <7E0e7.12187$vW2.6599957@news1.sttln1.wa.home.com> (raw)
In-Reply-To: 9l7qon$d78$1@nntp9.atl.mindspring.net

Here is a comparable definition (I put it in a small program to make sure it
compiled :-)
I didn't include a separate length field since you don't really need it with
Ada.  The length of the string may be found using
"str.ansi_string.all'length" or "str.wide_string.all'length".

Note that a default descriminant is used for the record such that the type
of the record may be changed dynamically at run time (by assigning the whole
record).


with Ada.Strings.Unbounded;  -- Defines String_Access and Free
 use Ada.Strings.Unbounded;
with Ada.Strings.Wide_Unbounded; -- Defines Wide_String_Access and Free
 use Ada.Strings.Wide_Unbounded;

procedure string_demo is

  type str_type is ( ansi, wide );

  type string_desc( str_select : str_type := ansi ) is
    record
      case str_select is
        when ansi =>
          ansi_string : String_Access;
        when wide =>
          wide_string : Wide_String_Access;
      end case;
    end record;

begin
  declare
    str : string_desc;
  begin
    str := ( str_select => ansi, ansi_string => new String'( "Hello" ) );
    Free( str.ansi_string );
    str := ( str_select => wide, wide_string => new Wide_String'(
"There" ) );
    Free( str.wide_string );
  end;
end string_demo;


I hope this helps,
SteveD


"Brian Catlin" <briancatlin@mindspring.com> wrote in message
news:9l7qon$d78$1@nntp9.atl.mindspring.net...
> I'm still trying to get both lobes around the Ada paradigm.  I have a
record that I want to hold a pointer to a buffer which is
> either a String or Wide_String, but I don't want to statically declare
which, so using a variant record won't work (at least given
> my understanding).  Likewise, I don't want to have two record definitions,
one for String, and one for Wide_String.  In the package
> I'm designing, I don't care whether it is a String or Wide_String, I will
just pass it to the file I/O packages (stream, in this
> case).  In C, I would:
>
> struct
>     {
>     ULONG    length;
>
>     union
>         {
>         STRING_DESC                *ansi_string;
>         WIDE_STRING_DESC    *wide_string;
>         } strings;
>     } string_desc;
>
> and then:
>
> struct
>     {
>     ...
>     string_desc    file_name;
>     ...
>     } some_struct;
>
> What is the idiom or method to use in Ada?
>
>  -Brian
>
>
>





  parent reply	other threads:[~2001-08-14  3:09 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-08-13  6:06 C-style 'union' in Ada? Brian Catlin
2001-08-13  7:34 ` tmoran
2001-08-14  3:09 ` DuckE [this message]
2001-08-14  3:49   ` Brian Catlin
2001-08-14  7:37     ` Martin Dowie
2001-08-14  9:39       ` Ole-Hjalmar Kristensen
2001-08-14 11:49         ` Martin Dowie
2001-08-14 13:38 ` Ted Dennison
2001-08-16 22:35   ` David Brown
2001-08-17  3:14     ` Brian Catlin
2001-08-17 14:44       ` Ted Dennison
2001-08-17 16:38         ` Jeffrey Carter
2001-08-17 18:17           ` Ted Dennison
2001-08-17 18:45         ` Samuel T. Harris
2001-08-17  3:18     ` Variable sizes for record fields (was: C-style 'union' in Ada) Larry Kilgallen
2001-08-17  6:34       ` Variable sizes for record fields David Brown
2001-08-17 10:44         ` Larry Kilgallen
2001-08-17 19:18           ` Warren W. Gay VE3WWG
2001-08-17 21:36             ` Ken Burtch
replies disabled

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