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,LOTS_OF_MONEY 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-16 20:18:58 PST Path: archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!cpk-news-hub1.bbnplanet.com!chcgil2-snf1.gtei.net!news.gtei.net!news.binc.net!kilgallen From: Kilgallen@eisner.decus.org.nospam (Larry Kilgallen) Newsgroups: comp.lang.ada Subject: Variable sizes for record fields (was: C-style 'union' in Ada) Date: 16 Aug 2001 22:18:19 -0500 Organization: LJK Software Message-ID: References: <9l7qon$d78$1@nntp9.atl.mindspring.net> NNTP-Posting-Host: eisner.encompasserve.org X-Trace: grandcanyon.binc.net 998017936 8332 192.135.80.34 (17 Aug 2001 03:12:16 GMT) X-Complaints-To: abuse@binc.net NNTP-Posting-Date: Fri, 17 Aug 2001 03:12:16 +0000 (UTC) Xref: archiver1.google.com comp.lang.ada:12031 Date: 2001-08-16T22:18:19-05:00 List-Id: In article , David Brown writes: > Ted Dennison wrote: >> In article <9l7qon$d78$1@nntp9.atl.mindspring.net>, Brian Catlin says... >>> >>>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: > >> Thirdly, if I *did* have to have something like this for some reason >> (which right now I cannot fathom), I'd probably define two structures (no >> more or less work than defining one structure with both of them in it), >> and use pointer-based unchecked_conversion to change my view of the >> buffer between them. But its more likely I'd find a way to structurally >> arrange things so that I didn't need to do that... > > I have recently encountered a concrete example of the need for something > like this. The application is storing variable sized data fields in fixed > length records (say disk sectors). The block is defined as a large string. > The beginning of the block contains lengths for each of the variable sized > fields. The data items start at the end of the record and work their way > backward. This sounds to me like the beginning of the record definition is the discriminant values and the end of the record is the text fields. The one trick, to achieve a fixed size, is to have an extra discriminant to define the size of the "middle". This is based on my experience with Ada83. Perhaps Ada95 lets you do more "math" with discriminant values to avoid the need for an extra discriminant.