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,c3b704caaa76c7c5 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2002-12-18 08:36:27 PST Path: archiver1.google.com!news2.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!kibo.news.demon.net!news.demon.co.uk!demon!not-for-mail From: john@nospam.demon.co.uk (John McCabe) Newsgroups: comp.lang.ada Subject: Re: Constants instead of enum? Date: Wed, 18 Dec 2002 16:36:33 GMT Message-ID: <3e00a06b.19514981@news.demon.co.uk> References: <5ad0dd8a.0212180703.71f5b6b7@posting.google.com> NNTP-Posting-Host: pipehawk.demon.co.uk X-Trace: news.demon.co.uk 1040229351 13110 158.152.226.81 (18 Dec 2002 16:35:51 GMT) X-Complaints-To: abuse@demon.net NNTP-Posting-Date: Wed, 18 Dec 2002 16:35:51 +0000 (UTC) X-Newsreader: Forte Free Agent 1.21/32.243 Xref: archiver1.google.com comp.lang.ada:32028 Date: 2002-12-18T16:36:33+00:00 List-Id: On 18 Dec 2002 07:03:21 -0800, wojtek@power.com.pl (Wojtek Narczynski) wrote: >Hello, > >I have the following situation: I read request record from network, an >Unsigned_8 (byte) denotes its type. Valid types are 1..10. Response >record has the same structure as request record. I also want to reuse >the memory allocated for request as the response. Now problem: for >every unimplemented request type (outside 1..10 range) I am supposed >to send a response record with type 11 back. > >I am trying to use enumeration with representation clause for this, >but it just doesn't work. I read an Unsigned_8 from network, and all >its values are valid and should be handled gracefully, so I cannot use >this enum in the request structure. Because of this I have to convert >from Unsigned_8 to enumeration, but only sometimes. Then I have to use >unchecked conversion to get the enumeration's underlying Unsigned_8 to >store it in the response record (same structure and memory) as >request, so it has to be Unsigned_8. How is the record defined? You may be able to read in any value from the network and store it in the enumeration variable, then use the 'Valid attribute to determine whether or not the value is a valid one. If you use 11 to denote invalid, then you have the option of either: ---------- type My_Enum_Type is (Msg_0, Msg_1, : : Msg_Invalid); for My_Enum_Type use (Msg_0 => 0, Msg_1 => 1, : : Msg_Invalid => 11); for My_Enum_Type'size use 8; Enum_In_Variable : My_Enum_Type; -- read value into Enum_In_Variable if (Enum_In_Variable'Valid and then Enum_In_Variable /= Msg_Invalid) then blah blah else Enum_Out_Variable = Msg_Invalid; end if; ---------- or something like: ---------- type My_Enum_Type is (Msg_0, Msg_1, : : Msg_10); for My_Enum_Type use (Msg_0 => 0, Msg_1 => 1, : : Msg_10 => 10); for My_Enum_Type'size use 8; Msg_Invalid : constant Integer := 11; function To_My_Enum_Type is new Ada.Unchecked_Conversion (Integer, My_Enum_Type); Enum_In_Variable : My_Enum_Type; -- read value into Enum_In_Variable if (Enum_In_Variable'Valid) then blah blah else Enum_Out_Variable = To_My_Enum_Type (Msg_Invalid); end if; ---------- Or something like that. I haven't used Ada for a while to be honest, but that's probably how I'd do it. Someone else might shoot me down in flames though for making such a suggestion! >If I defined types as constants for 1..11 range the amount of code >necessary and conversions will reduce. >So my question is - would this be fine to use a group of consts in >this specific case instead of an enum? I could encapsulate them into a >nested package. Well you could do that I suppose. Best Regards John McCabe To reply by email replace 'nospam' with 'assen'