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.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,45a9122ddf5fcf5 X-Google-Attributes: gid103376,public From: mheaney@ni.net (Matthew Heaney) Subject: Re: Rules for Representation of Subtypes Date: 1996/09/24 Message-ID: #1/1 X-Deja-AN: 185054730 references: content-type: text/plain; charset=ISO-8859-1 organization: Estormza Software mime-version: 1.0 newsgroups: comp.lang.ada Date: 1996-09-24T00:00:00+00:00 List-Id: In article , bobduff@world.std.com (Robert A Duff) wrote: >>I've always been curious about the rules for representation of subtypes. >>For example, if I make a declaration like this: >> >> A_Small_Integer : Integer range 0 .. 255; -- assume type Integer is 4 bytes >> >>then is an implementation allowed to use fewer than 4 bytes to represent >>A_Small_Integer? > >Yes. > >>Suppose I'm on a Unix system and I do this >> >> read (fd, A_Small_Integer'Address, 4); >> >>If the representation of A_Small_Integer is only 1 byte, then obviously I'm >>in trouble. Am I required to specify the size of objects? > >Well, you could. But a better solution is to always say "aliased" when >you have a variable you want to take 'Address of. Aliased variables >will generally be represented the same way, for all variables of the >type. You say "generally" be represented the same way: can you be more specific? Under what circumstances can they be different? >Also, the number 4 is questionable. What are you trying to do? Read 4 >bytes of data? Well in that case, you want to make sure the target >variable is 4 bytes (which your code doesn't do). Or are you trying to >read however-many-bytes it takes to fill up A_Small_Integer? In that >case, you should be asking for that number of bytes, not 4 bytes. (You >can calculate it based on 'Size, which, unfortunately, is in bits.) Perhaps this was a poor example: I would never actually do it that way in real code. I just needed an example to ask my question about size of objects of subtypes. Better is: A_Small_Integer: Interfaces.Integer_32 range 0 .. 255; But of course, if I'm going to read 4 bytes from an OS call, then The_Value : Interfaces.Integer_32; is best. BTW: Why doesn't Ada have a 'Storage_Size clause for (non-access) types or objects? If everywhere I want storage units, I have to do this: read (fd, O'Address, O'Size / System.Storage_Unit); If "number of storage units" is required so much, and the expression O'Size/System.Storage_Unit is so popular, then why didn't the Ada designers save me the trouble, so I could say read (fd, O'Address, O'Storage_Units); or even read (fd, O'Address, O'Number_Of_Bytes); I've seen this kind of error often, where the programmer sends the 'Size without dividing by 8 first. The error is exacerbated when documentation (say, on a Unix box) refers to size, and means "number of bytes." So easy to forget to divide O'Size by 8! Byte-size is an undeniably popular unit of measure in programming. The fact that there's no *direct* support for it in Ada seems to me to be an egregious oversight. (But I'm sure there was a reason...) Here's another question: type T is new Interfaces.Integer_32 range 0 .. 255; What is the size of T? Do I need to specify a size clause to ensure that objects of type T are 4 bytes? >> A_Small_Integer : Integer range 0 .. 255; >> for A_Small_Integer'Size use 32; -- required? > >That will make it the right size. But if you read 4 non-zero bytes, >your program will be erroneous. You are of course correct. -------------------------------------------------------------------- Matthew Heaney Software Development Consultant mheaney@ni.net (818) 985-1271