Типизация от C ++ до Delphi

0

Как перевести это в 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++. Но я думаю, что это может быть связано с моей неудачей.

  • 0
    Как примечание: char в вашей строке означает скорее Byte , а не AnsiChar . И если вы ссылаетесь на блок кучи динамического массива Delphi, вы должны записать его как @temp[Low(temp)] (индекс expr имеет значение 0, ofc).
  • 0
    Интересно, спасибо за ваш вклад. Я изменил свой код, сделанный в вашем комментарии, но я все еще не получаю желаемых результатов.
Теги:

1 ответ

1
Лучший ответ

C++ строка кода с new выделяет blocksize байты памяти и указатель на нужный тип.
Ваш @temp является указателем на указатель. Это не то, что мы хотим.
В Delphi вы можете сделать:

GetMem(dir.dirbuf, blocksize);

Из приведенного выше кода неясно, почему размер выделения составляет 4096 вместо параметра SizeOf (Ext2_Dir_Entry)

  • 0
    Размер blocksize задается в другом месте кода. Я использовал 4096 как константу для проверки кода. Также ваше предложение по-прежнему не дает желаемых результатов.
  • 0
    Мы не знаем о вашем другом коде. Вы уверены, что все правильно?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню