У меня есть этот макрос, определенный на C++;
#define EXT_FIRST_EXTENT(__hdr__) \
((struct ext4_extent *) (((char *) (__hdr__)) + \
sizeof(struct ext4_extent_header)))
Где ext4_extent_header
— это структура;
typedef struct ext4_extent_header {
uint16_t eh_magic; /* probably will support different formats */
uint16_t eh_entries; /* number of valid entries */
uint16_t eh_max; /* capacity of store in entries */
uint16_t eh_depth; /* has tree real underlying blocks? */
uint32_t eh_generation; /* generation of the tree */
}__attribute__ ((__packed__)) EXT4_EXTENT_HEADER;
И ext4_extent тоже является структурой;
typedef struct ext4_extent {
uint32_t ee_block; /* first logical block extent covers */
uint16_t ee_len; /* number of blocks covered by extent */
uint16_t ee_start_hi; /* high 16 bits of physical block */
uint32_t ee_start_lo; /* low 32 bits of physical block */
} __attribute__ ((__packed__)) EXT4_EXTENT;
Это моя попытка написать это в Delphi;
function Ext2Partition.EXT_First_Extent(hdr: PExt4_extent_header):PExt4_ExtEnt;
begin
Result := PExt4_ExtEnt(hdr + sizeof(ext4_extent_header));
end;
Однако компилятор говорит мне, что оператор не применим к этому типу операнда.
Вот моя преобразованная структура С++ в записи Delphi для ext4_extent_header
и ext4_extent
;
Type
PExt4_extent_header = ^Ext4_extent_header;
Ext4_extent_header = REcord
eh_magic : Word;
eh_entries : Word;
eh_max : Word;
eh_depth : Word;
eh_generation : Cardinal;
End;
Type
PExt4_ExtEnt = ^Ext4_ExtEnt;
Ext4_ExtEnt = Record
ee_block : Cardinal;
ee_len : Word;
ee_start_hi : Word;
ee_start_low : Cardinal;
End;
Спасибо!
Cardinal(hdr) + sizeof...
. - person 500 - Internal Server Error   schedule 11.02.2015ptr
в типCardinal
(или в типUIntPtr
для большего удобства):Result := PExt4_ExtEnt(UIntPtr(hdr) + sizeof(ext4_extent_header));
- person Abelisto   schedule 11.02.2015packed record
вместоrecord
, потому что директива__packed__
в исходном коде C. - person Abelisto   schedule 11.02.2015