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
>
>
>
next prev 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