问题描述
我有用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;