Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2018-08

SizeOf( const typcasted as shortstring)

6 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Dmitry Boyarintsev
to Bart
PM Bart wrote 10 lines
const x = ShortString('abc'); begin writeln(SizeOf(x)); end. Delphi (7) prints 256, fpc prints 3. Is that a bug or an implementation detail?

Implementation detail.
And it seems to be wrong on Delphi size, because for reason it assigns a type to a (non-typed) constant.
It would make sense to return 256, if the constant was declared like this: const

   x : ShortString = 'abc';

and fpc does recognize such typed constant as 256 in size.

It's odd that such expression compiles w/o any warnings or notes. (i.e. "ignoring typecasting for constant value expressions")

thanks,
Dmitry

Reply by email

Martin
to Dmitry Boyarintsev
Dmitry Boyarintsev wrote 17 lines
On Sun, Aug 12, 2018 at 5:40 PM Bart < > wrote: const   x = ShortString('abc'); begin   writeln(SizeOf(x)); end. Delphi (7) prints 256, fpc prints 3. Is that a bug or an implementation detail? Implementation detail. And it seems to be wrong on Delphi size, because for reason it assigns a type to a (non-typed) constant.

Interesting.

Yet the compiler still seems to add some type or at least type specific behaviour. (That alone is ok)

But if the first string has the length in a[0], then that constant has 6 bytes of data. Yet sizeof only reports 5.
So what is the real size of this constant?

program Project1; {$H+}
const
   a = 'abcde';
   b = 'abcde
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
begin
   writeln(SizeOf(a)); // 5
   writeln(SizeOf(b)); // 5
   writeln(byte(a[0]));  // no range check / shortstring has index 0
with length
   writeln(byte(b[0])); // range check / not a shortstring
   readln;
end.

Reply by email

Martin
to Martin
Martin wrote 36 lines
On 13/08/2018 00:12, Dmitry Boyarintsev wrote: > On Sun, Aug 12, 2018 at 5:40 PM Bart < > > wrote: > > const >   x = ShortString('abc'); > begin >   writeln(SizeOf(x)); > end. > > Delphi (7) prints 256, fpc prints 3. > > Is that a bug or an implementation detail? > > Implementation detail. > And it seems to be wrong on Delphi size, because for reason it > assigns a type to a (non-typed) constant. > Interesting. Yet the compiler still seems to add some type or at least type specific behaviour. (That alone is ok) But if the first string has the length in a[0], then that constant has 6 bytes of data. Yet sizeof only reports 5. So what is the real size of this constant? program Project1; {$H+} const   a = 'abcde';   b = 'abcde 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; begin   writeln(SizeOf(a)); // 5   writeln(SizeOf(b)); // 5

copy and paste, this on prints the length of b

Show quoted text 12 lines
writeln(byte(a[0]));  // no range check / shortstring has index 0 with length   writeln(byte(b[0])); // range check / not a shortstring   readln; end. _______________________________________________ fpc-devel maillist - http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply by email

Sven Barth
to Dmitry Boyarintsev: Implementation detail. And it seems to be wrong on Delphi size, because for reason it…

Dmitry Boyarintsev schrieb am Mo., 13. Aug.
2018, 00:12:

Show quoted text 24 lines
On Sun, Aug 12, 2018 at 5:40 PM Bart wrote: > const > x = ShortString('abc'); > begin > writeln(SizeOf(x)); > end. > > Delphi (7) prints 256, fpc prints 3. > > Is that a bug or an implementation detail? > Implementation detail. And it seems to be wrong on Delphi size, because for reason it assigns a type to a (non-typed) constant. It would make sense to return 256, if the constant was declared like this: const x : ShortString = 'abc'; and fpc does recognize such typed constant as 256 in size. It's odd that such expression compiles w/o any warnings or notes. (i.e. "ignoring typecasting for constant value expressions")

Support for typecasts in untyped constants is by design and sometimes required, e.g. for unsigned 64-Bit values.

Regards,
Sven

Reply by email

Dmitry Boyarintsev
to Sven Barth

On Mon, Aug 13, 2018 at 5:24 AM Sven Barth via fpc-devel <

Show quoted text 10 lines
wrote: It's odd that such expression compiles w/o any warnings or notes. (i.e. > "ignoring typecasting for constant value expressions") > Support for typecasts in untyped constants is by design and sometimes required, e.g. for unsigned 64-Bit values. Does it mean, that in case of ShortString casting the value of the

constant string should be extended up to 255 (256?) characters?

thanks,
Dmitry

Reply by email