[fpc-pascal] Re: [fpc-devel] Illegal type conversion errors in FPC 2.5.1
Jonas Maebe
jonas.maebe at elis.ugent.be
Mon Nov 23 14:42:51 CET 2009
On 23 Nov 2009, at 13:11, Juha Manninen wrote:
> In the latest Delphi VirtualTreeView version the typecast is changed
> to Byte
> or Word depending on the element count in a set.
> I decided to do the same thing. Then I realized the code doesn't
> work with FPC
> 2.2.4, so I added {$packset 1} or {$packset 2} directives.
> {$packset 1} if elementcount < 9.
> {$packset 2} if 8 < elementcount < 17.
> And I changed the typecasts accordingly to Byte or Word.
You can just add {$packset 1} once. It simply tells the compiler that
the minimal size by which it can increment the size of sets is 1 byte
(rather than the default 4 bytes). It does not mean that the compiler
will try to store all sets in 1 byte.
> What happens if (without $packset directives) a set has 17 elements?
> Does it use 3 or 4 bytes?
It will always be 4 bytes, even with {$packset 1}. Sets of 3 bytes do
not exist in FPC nor Delphi, that's a special case (probably to make
it easier to keep them in a register).
> What if there are > 32 elements?
Then in the default case, the set will be 32 bytes. With {$packset x},
the size of the set will be rounded up to the nearest multiple of x
that is large enough to hold all elements.
> The casting here is used for streaming data, with Stream WriteBuffer
> and
> ReadBuffer.
> Is there any better way of doing this than casting to Byte, Word or
> LongWord
> and counting the elements?
Something like this:
type
tsetarray = array[1..32] of byte;
psetarray = ^tsetarray;
var
i: longint;
begin
for i:=1 to sizeof(setvar) do
write(psetarray(@setvar)^[i])
end.
More information about the fpc-devel
mailing list