From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,13703514e3723cbe X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2001-08-13 20:09:56 PST Path: archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!paloalto-snf1.gtei.net!news.gtei.net!enews.sgi.com!newshub2.rdc1.sfba.home.com!news.home.com!news1.sttln1.wa.home.com.POSTED!not-for-mail From: "DuckE" Newsgroups: comp.lang.ada References: <9l7qon$d78$1@nntp9.atl.mindspring.net> Subject: Re: C-style 'union' in Ada? X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4522.1200 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200 Message-ID: <7E0e7.12187$vW2.6599957@news1.sttln1.wa.home.com> Date: Tue, 14 Aug 2001 03:09:55 GMT NNTP-Posting-Host: 24.248.45.203 X-Complaints-To: abuse@home.net X-Trace: news1.sttln1.wa.home.com 997758595 24.248.45.203 (Mon, 13 Aug 2001 20:09:55 PDT) NNTP-Posting-Date: Mon, 13 Aug 2001 20:09:55 PDT Organization: Excite@Home - The Leader in Broadband http://home.com/faster Xref: archiver1.google.com comp.lang.ada:11883 Date: 2001-08-14T03:09:55+00:00 List-Id: 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" 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 > > >