2015-02-07 106 views
0

我怎麼會轉化爲德爾福呢?從C++的類型轉換德爾福

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++中的功能。但我認爲這可能與我的失敗有關。

+0

作爲邊注:'你行char'問題意味着更可能是「字節」,而不是「AnsiChar」。如果你正在引用Delphi的** **動態陣列的堆塊,則必須把它寫爲'@temp [低(TEMP)]'(索引expr取值爲0,OFC)。 – 2015-02-07 13:49:35

+0

有趣,感謝您的意見。我修改了你的評論中的代碼,但我仍然沒有得到期望的結果。 – 2015-02-07 14:15:28

回答

1

C++代碼與new線分配blocksize字節的存儲器,並投指針所需類型。
您的@temp是指向指針的指針。這不是我們想要的。
在Delphi中你可以做:

GetMem(dir.dirbuf, blocksize); 

它是不是從上面的代碼,爲什麼分配大小爲4096,而不是一下SizeOf清晰(Ext2_Dir_Entry)

+0

'blocksize'在代碼的其他地方設置。我用4096作爲常量來測試代碼。此外,你的建議仍然沒有給出預期的結果。 – 2015-02-07 13:52:17

+0

我們不知道你的另一個代碼。你確定一切正確嗎? – MBo 2015-02-07 16:05:08

+0

你調試了一個代碼嗎? – MBo 2015-02-07 16:10:58