W. Wesley Groleau x4923 wrote: > > I met a guy who is definitely anti-Ada and pro-C. Unfortunately, he is > now a support person for an Ada vendor. Recently he responded to a bug > report as follows: > > I have researched this problem and find that the designers of the Ada > language changed the meaning of the Size attribute. Basically, the > difference is that Ada 83 gave you the size of the storage container and > Ada 95 gives you the size of the bits of actual interest. As what is > normally wanted for programming purposes is the number of bytes, the Ada > 83 construction X'Size/8 was just fine. To get the same result in Ada > 95, what is wanted is (X'Size+7)/8. For any customer converting from > Ada 83 to Ada 95, this is a problem because it shows up in small print > in the middle of hundreds of pages that only a compiler-writer could > love. > > We can argue about the poor form of the Ada 95 designers to change the > meaning of something, essentially postponing error detection to runtime, > but the solution is simple. Any project converting from Ada 83 to Ada 95 > should grep over their source tree and examine any uses of 'Size. > > I do not anticipate any change to alleviate the impact of the language > designers decision. The only change I believe we might see, not in a > short timeframe, would be to add a [vendor-specific] attribute something > like X'Size83. Either way, source code would need to be examined and > changed. This guy is right regarding the consequences of the change in the definition of 'Size in Ada 95 (I have converted programs and it really is a pain). He is wrong when he says that 'Size has changed between '83 and '95: it was underspecified in '83, and the compilers I have been using were making an interpretation that is defferent from the one that got standardized (bad luck ? :-). > MY RESPONSE: > The real problem is that Object'Size/8 was never the correct way to find > the number of octets an object had bits in. In all dialects of Ada, > integer division truncates. Therefore: > > Object'Size Object'Size/8 (Object'Size+7)/8 > 1 0 1 > 5 0 1 > 7 0 1 > 8 1 1 > 9 1 2 I think you are missing the difference between Type'Size and Object'Size in Ada 95. Type'Size is the minimal required size in a packed record, and Object'Size is something else, and should be a multiple of the type's alignment (I recommend you re-read RM 13.3). Note that Object'Size will almost never be 1, 5, 7 or 9 as in your table above, but Type'Size could. Anyway, 'Size is still not good enough in all situations. I have had to use GNAT's vendor specific 'Object_Size in some cases.