2015-02-07 3 views
0

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

+0

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

+0

Интересно, спасибо за ваш вклад. Я изменил свой код, сделанный в вашем комментарии, но я до сих пор не получаю желаемых результатов. –

ответ

1

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

GetMem(dir.dirbuf, blocksize); 

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

+0

'blockize' установлен в другом месте кода. Я использовал 4096 как константу для проверки кода. Также ваше предложение по-прежнему не дает желаемых результатов. –

+0

Мы не знаем о вашем другом коде. Вы уверены, что все правильно? – MBo

+0

Вы отлаживали код? – MBo