I don't think it's surprising that a 32 bit compiler likes to
align data to 32 bit (4 byte) boundaries. ;-)
I'm no expert on this, but I suspect this may be an
"optimisation" setting in the compiler build (for optimal
code speed, I guess).
Another thing to try is the magic word "packed", as in
"packed record", in lieu of simply "record" ...
Joe.
> -----Original Message-----
> From: Oldham, Adam [SMTP:adam.oldham@marconi.com]
> Sent: Thursday, September 06, 2001 7:36 AM
> To: 'gpc(a)gnu.de'
> Subject: Problems/Questions/Answers
>
> Well, I think I have figured out a way to work around the String problem.
> That being, to create types for each String I want to use and making it a
> packed array of whatever, for example:
> String2 = PACKED ARRAY[0..2] OF CHAR;
>
> This will allow the length to be stored in byte 0, and allow data in 1..2.
> This does require that the CONCAT, etc functions to be modified, but that
> is
> far easier than modifying the GPC Source.
>
> Now, I have a questions about GPC's word alignment. I currently have this
> source:
> ===========================================================
> program test;
>
> type
>
> desbuffer = packed array [1..8] of byte;
>
> enum1 = (encrypt,decrypt);
>
> record2 = record
> f1 : desbuffer;
> f2 : enum1;
> end;
>
> record1 = record
> b1 : byte;
> b2 : byte;
> case INTEGER of
> 1 : (r2 : record2);
> end;
>
> var
> r1 : record1;
>
> begin
>
> writeln('sizeof r1 = ',sizeof(r1));
>
> writeln('r1.b1 = ',INTEGER((a)r1.b1));
> writeln('r1.b2 = ',INTEGER((a)r1.b2));
> writeln('r1.r2.f1 = ',INTEGER((a)r1.r2.f1));
> writeln('r1.r2.f2 = ',INTEGER((a)r1.r2.f2));
>
> end.
> =====================================================
> With, the alignment of the output is:
> sizeof r1 = 16
> r1.b1 = 134678600
> r1.b2 = 134678601
> r1.r2.f1 = 134678604
> r1.r2.f2 = 134678612
>
> Our old compiler did this:
> sizeof r1 = 12
> r1.b1 = 4197796
> r1.b2 = 4197797
> r1.r2.f1 = 4197798
> r1.r2.f2 = 4197806
>
> Basically, GPC adds 3 extra bytes between record r1's b2 variable and the
> variant part of the record, where our old compiler only used 1 byte more.
> Is there a way to get GPC to pack in more closely for this type of
> instance?
>
>
>
> Next question regards ennumerated types, can enummerated type space be
> smaller than 4 bytes minimum?
> For example:
> TYPE:
> eVideoMode = (VideoStandard,
> VideoEnhanced);
> VAR
> a : eVideoMode;
>
> BEGIN
> Writeln (sizeof(a));
> end.
>
> With GPC, the output is 4. With our old compiler, it stored the size of
> an
> enummerated variable as 1.
>
>
>
> I know these questions may be annoying, and I apologize for that. But the
> compiler evaluation is almost complete. These are some of the last big
> features that we cannot find workarounds for.... so if you know any,
> please
> let me know.
>
> Adam
> END
>
>
> -----------------------------------------------------------------------
> C. Adam Oldham Marconi Commerce Systems Inc.
> Software Engineer 7300 West Friendly Ave.
> adam.oldham(a)marconi.com Greensboro, NC 27420-2087
> Phone : 336.547.5952 Fax : 336.547.5079
> -----------------------------------------------------------------------
> This document contains confidential information of Marconi Commerce
> Systems Inc. In consideration of the receipt of this document, the
> recipient agrees not to reproduce, copy, use or transmit this document
> and/or the information contained herein, in whole or in part, or to
> suffer such actions by others, for any purpose except with written
> permission, first obtained, of Marconi Commerce Systems Inc., and
> further agrees to surrender the same to Marconi Commerce Systems Inc.
> upon demand.
> -----------------------------------------------------------------------