如何将C ++结构转换为Delphi

问题描述

我有用C ++编写的代码,我想将此代码转换为delphi记录类型。我对此主题的知识有限,因此无法实现。联盟部分结束后如何翻译?

struct backed_block
{
    unsigned int block;
    unsigned int len;
    enum backed_block_type type;

    union
    {
        struct
        {
            void* data;
        } data;

        struct
        {
            char* filename;
            int64_t offset;
        } file;

        struct
        {
            int fd;
            int64_t offset;
        } fd;

        struct
        {
            uint32_t val;
        } fill;

    };

    struct backed_block* next;
};

解决方法

我相信就是这样。您必须确定是否需要打包记录。您可能还需要更新WhoIsBehindThisUsername的TBackedBlockType(我已经将其复制到示例中)的定义,因为您在问题中没有给出此定义。

TYPE
  TBackedBlockType      = (bbtData,bbtFD,bbtFile,bbtFill);
  TDataStruct           = PACKED RECORD
                            Data        : POINTER;
                          END;
  TFileStruct           = PACKED RECORD
                            FileName    : PAnsiChar;
                            Offset      : Int64
                          END;
  TFDStruct             = PACKED RECORD
                            FD          : Int32;
                            Offset      : Int64
                          END;
  TFillStruct           = PACKED RECORD
                            Val         : Int32
                          END;
  TUnion                = PACKED RECORD
                            CASE BlockType : TBackedBlockType OF
                              0 : (Data : TDataStruct);
                              1 : (Fil_ : TFileStruct);
                              2 : (FD   : TFDStruct);
                              3 : (Fill : TFillStruct)
                          END;
  PBackedBlock          = ^TBackedBlock;
  TBackedBlock          = PACKED RECORD
                            Block       : UInt32;
                            Len         : UInt32;
                            Union       : TUnion;
                            Next        : PBackedBlock
                          END;

要访问字段,请使用以下格式:

VAR R : TStruct;

R.Union.Data.Data:=NIL;
R.Union.Fill.Val:=32;
R.Union.FD.Offset:=$0123456789ABCEDF;
R.Union.Fil_.FileName:='C:\pagefile.sys';
R.Block:=$DEADBABE;
R.Next:=NIL;
R.Union.BlockType:=TBackedBlockType.bbtData;

由于“文件”是Delphi中的保留字,因此我不得不将C结构的“文件”部分称为“ Fil_”。同样,在字段“类型”->“ BlockType”中。

,

更新为@HeartWare评论,您可能会说些什么,并更新 TUnion TBackedBlockType

type
  TBackedBlockType      = (bbtData,bbtFill);
 
  TUnion                = PACKED RECORD
                            CASE  BlockType:TBackedBlockType OF
                              bbtData : (Data : TDataStruct);
                              bbtFile : (File_ : TFileStruct);
                              bbtFD   : (FD   : TFDStruct);
                              bbtFill : (Fill : TFillStruct)
                          END;


 var
  X : TBackedBlock;
begin

  x.Block := 1;
  x.Len   := 256;
  //x.Union.BlockType := bbtFile; only needed if you write to the struct 
  case x.Union.BlockType of
    bbtData  : begin
                 {.. Read or Write ....}
               end;
    bbtFile  : begin
                {Example}
                x.Union.File_.FileName := 'FileName';
                x.Union.File_.Offset   := 13;
               end;
    bbtFD    : begin
             {.. Read or Write ....}
               end;
    bbtFill  : begin
             {.. Read or Write ....}
               end;
  end;