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

Reply via email to