Как перевести это в Delphi?
typedef struct ext2dirent {
EXT2_DIR_ENTRY *next;
EXT2_DIR_ENTRY *dirbuf;
Ext2File *parent;
lloff_t read_bytes; // Bytes already read
lloff_t next_block;
} EXT2DIRENT;
typedef struct tagEXT2_DIR_ENTRY {
uint32_t inode; /* Inode number */
uint16_t rec_len; /* Directory entry length */
uint8_t name_len; /* Name length */
uint8_t filetype; /* File type */
char name[EXT2_NAME_LEN]; /* File name */
} __attribute__ ((__packed__)) EXT2_DIR_ENTRY;
EXT2DIRENT *dirent;
int blocksize = 4096;
dirent->dirbuf = (EXT2_DIR_ENTRY *) new char[blocksize]; //<-- This line
Я думал о том, чтобы сделать что-то подобное;
Type
PExt2_Dir_Entry = ^Ext2_Dir_Entry;
Ext2_Dir_Entry = packed Record
inode: Cardinal;
rec_len : Word;
name_len : Byte;
filetype : Byte;
name : Array[0..EXT2_NAME_LEN-1] of AnsiChar;
End;
var
temp : array of AnsiChar;
if dir = NIL then
Result := nil;
SetLength(temp,self.block_size-1);
dir.dirbuf := PExt2_Dir_Entry(@temp);
Однако я не получаю результат, которого я ожидал бы в dir.dirbuf
. Я не понимаю, что делает new char
функция new char
в C++. Но я думаю, что это может быть связано с моей неудачей.
C++ строка кода с new
выделяет blocksize
байты памяти и указатель на нужный тип.
Ваш @temp является указателем на указатель. Это не то, что мы хотим.
В Delphi вы можете сделать:
GetMem(dir.dirbuf, blocksize);
Из приведенного выше кода неясно, почему размер выделения составляет 4096 вместо параметра SizeOf (Ext2_Dir_Entry)
blocksize
задается в другом месте кода. Я использовал 4096 как константу для проверки кода. Также ваше предложение по-прежнему не дает желаемых результатов.
char
в вашей строке означает скорееByte
, а неAnsiChar
. И если вы ссылаетесь на блок кучи динамического массива Delphi, вы должны записать его как@temp[Low(temp)]
(индекс expr имеет значение 0, ofc).