Show quoted text 15 lines
On 08.07.2012 17:18, Hans-Peter Diettrich wrote:
> Bernd schrieb:
>> 2012/7/7 Marco van de Voort :
> 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 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.
Show quoted text 6 lines
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).
Show quoted text 13 lines
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