Jump to content
Alexander Sviridenkov

Linux: wrong enum size

Recommended Posts

Looks like there is bug in 10.3 Linux compiler: maximum enum size is limited to 8 bytes. F.e.


 

type

 TMyEnum = (a1, a2, ..a100);

 TMyEnums = set of TMyEnum;

var X: TMyEnums;

sizeof(X) returns 8 on Linux platform.

Share this post


Link to post
program LargeEnumSet;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TLargeEnum = (
    e000, e001, e002, e003, e004, e005, e006, e007, e008, e009, e010, e011, e012, e013, e014, e015, e016, e017, e018, e019,
    e020, e021, e022, e023, e024, e025, e026, e027, e028, e029, e030, e031, e032, e033, e034, e035, e036, e037, e038, e039,
    e040, e041, e042, e043, e044, e045, e046, e047, e048, e049, e050, e051, e052, e053, e054, e055, e056, e057, e058, e059,
    e060, e061, e062, e063, e064, e065, e066, e067, e068, e069, e070, e071, e072, e073, e074, e075, e076, e077, e078, e079,
    e080, e081, e082, e083, e084, e085, e086, e087, e088, e089, e090, e091, e092, e093, e094, e095, e096, e097, e098, e099,
    e100, e101, e102, e103, e104, e105, e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, e118, e119,
    e120, e121, e122, e123, e124, e125, e126, e127, e128, e129, e130, e131, e132, e133, e134, e135, e136, e137, e138, e139,
    e140, e141, e142, e143, e144, e145, e146, e147, e148, e149, e150, e151, e152, e153, e154, e155, e156, e157, e158, e159,
    e160, e161, e162, e163, e164, e165, e166, e167, e168, e169, e170, e171, e172, e173, e174, e175, e176, e177, e178, e179,
    e180, e181, e182, e183, e184, e185, e186, e187, e188, e189, e190, e191, e192, e193, e194, e195, e196, e197, e198, e199
    );
    TLargeEnumSet = Set of TLargeEnum;

procedure TestLargeEnum;
var
  LargeEnumSet: TLargeEnumSet;
  Enum: TLargeEnum;
begin
  LargeEnumSet := [e011, e031, e051, e071, e091, e111, e131, e151, e171, e191];
  Writeln('SizeOf = ', SizeOf(LargeEnumSet));
  for Enum in LargeEnumSet
  do Write(Ord(Enum),' ');
  Writeln;
end;

begin
  try
    try
      TestLargeEnum;
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Write('Press Enter: ');
    Readln;
  end;
end.

output on Win32 and Win64
 

Quote

SizeOf = 25
11 31 51 71 91 111 131 151 171 191
Press Enter:

 

 

What is the output on Linux?

Share this post


Link to post

Unfortunately, the debugger often shows incorrect values

Share this post


Link to post
Guest

Changing "this setup" have some relevance for your case?

  • Double Word = LongInt (if I dont wrong) - non-signed = SizeOf = 4bytes = 2^32-1 ... 0 to 4,294,967,295 = Cardinal
  • using "Minimum enum size = Double Word", the "type" have 4bytes of size - not a "var" !!!
    • as necessary "re-build" the .DCU to recreate new compiled code!

 

image.thumb.png.8465ba94dbe4cc975496467b3f667fc1.png 

  image.thumb.png.465eecc0dc64aa15fb766bba0e26b2dc.png  image.thumb.png.b195cf86857316fc9d9cc06f1bb5305b.png

hug

Edited by Guest

Share this post


Link to post
Guest
14 minutes ago, Alexander Sviridenkov said:

How mininum enume size may affect this case? This test enum is larger than maximum setting for "Minimum enum size" parameter.

did you test it in your Linux 64? have a relevance in your resulted?

 

Quote

maybe "minimun" would stay better if "maximun" but... is a Embarcadero domain!

 

Edited by Guest

Share this post


Link to post
Guest

for "specific point", yes. for all project, better on .dproj

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×