Bernd K. schrieb:
On 08.07.2012 17:18, Hans-Peter Diettrich wrote:
Bernd schrieb:
2012/7/7 Marco van de Voort <[email protected]>:
IMO all these members should be pointers, of size 64 bit according to
the index increment (8 bytes?). Typecasts will be needed for 32 bit
pointers, as demonstrated in above code.
Wait a monment, I have again looked at it. I think I was right and my
other email admitting that I was wrong was wrong.
seqence_crc = *((int64_t*)data);
seqence_key = *((int64_t*)&data[8]);
from the inside out:
data is a pointer, say it points to a buffer
It's a variable, which can be an array.
(int64_t*)data still points to that buffer
*((int64_t*)data) are bytes 0..7 of that buffer as int64.
No, as "int64_t*", what's a "^int64" in Pascal.
now the second line
seqence_key = *((int64_t*)&data[8]);
data[8] is the same as *(data+8)
data[8] represents the 8th byte of that buffer (already dereferenced!)
It represents the 8th *element*, which here (most probably) is a byte.
It could be something else, depending on the declaration of "data".
&data[8] is the address of that byte
This address is untyped in C - that's the trick and purpose of the
entire construct. In OPL you can have both typed or untyped @ operators,
depending on compiler options, but here a typecast into the real data
type is required in either case.
&data[8] would be the same as (data+8)
((int64_t*)&data[8]) is still the same pointer
It's a pointer *starting* at that address.
*((int64_t*)&data[8]) are bytes 8..17 of that buffer as int64
The size of the pointer depends on the target memory model (16/32/64
bit). There is room for an 64 bit pointer in bytes 8..15, but how many
bytes really are used depends on the sizeof(pointer).
this should be equivalent:
seqence_crc = *((int64_t*)&data[0]);
seqence_key = *((int64_t*)&data[8]);
compr_crc = *((int64_t*)&data[16]);
compr_len = *((int32_t*)&data[24]);
and this also:
seqence_crc = *((int64_t*)data);
seqence_key = *((int64_t*)(data+8));
compr_crc = *((int64_t*)(data+16));
compr_len = *((int32_t*)(data+24));
Its really just a simple record with 4 numbers in it.
With 4 pointers in it, aligned to 8 byte boundaries.
DoDi
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus