从C ++到Delphi的类型转换

时间:2015-02-07 03:44:42

标签: c++ delphi

我如何将其翻译成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功能在C ++中的作用。但我认为这可能与我的失败有关。

1 个答案:

答案 0 :(得分:1)

带有new的C ++代码行分配blocksize字节的内存并将指针转换为所需类型。
你的@temp是指向指针的指针。这不是我们想要的 在Delphi中你可以这样做:

GetMem(dir.dirbuf, blocksize);

上面的代码不清楚为什么分配大小是4096而不是SizeOf(Ext2_Dir_Entry)