Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 包含记录指针的访问冲突RTTI转储记录 使用RTTI; 类型TMyRecord=打包记录 名称:字符串[20]; 年龄:整数; 结束; 类型TMasterCtrl=打包记录 MyRecord:^TMyRecord;//可以通过更改为“MyRecord:指针”来避免错误` 结束; 过程RTTIDump(实例,ATypeInfo:Pointer;Memo:TStrings;NameWidth,FieldTypeWidth,ValueWidth:Integer;PaddingChar:Char); 变量 rType:trttype; 领域:焦油; i:整数; 开始 rType:=TRTTIContext.Create.GetType(ATypeInfo); Memo.Add(rType.ToString); 字段:=rType.GetFields; 对于i:=0到高(字段)do 备注.添加(格式(“%s:%s::%s”)[ 字段[i].Name.PadRight(NameWidth,PaddingChar), 字段[i].FieldType.ToString.PadRight(FieldTypeWidth,PaddingChar), 字段[i].GetValue(实例).ToString.PadRight(FieldTypeWidth,PaddingChar)]); 结束; 程序TForm3.按钮2单击(发件人:ToObject); 变量 我的记录:特米雷科德; MasterCtrl:TMasterCtrl; 开始 myRecord.name:=“Fred Bloggs”; myRecord.age:=23岁; MasterCtrl.MyRecord:=@MyRecord; RTTIDump(Addr(MasterCtrl),TypeInfo(TMasterCtrl),Memo1.line,18,18,0',); 结束;_Delphi_Pointers_Record_Dump_Rtti - Fatal编程技术网

Delphi 包含记录指针的访问冲突RTTI转储记录 使用RTTI; 类型TMyRecord=打包记录 名称:字符串[20]; 年龄:整数; 结束; 类型TMasterCtrl=打包记录 MyRecord:^TMyRecord;//可以通过更改为“MyRecord:指针”来避免错误` 结束; 过程RTTIDump(实例,ATypeInfo:Pointer;Memo:TStrings;NameWidth,FieldTypeWidth,ValueWidth:Integer;PaddingChar:Char); 变量 rType:trttype; 领域:焦油; i:整数; 开始 rType:=TRTTIContext.Create.GetType(ATypeInfo); Memo.Add(rType.ToString); 字段:=rType.GetFields; 对于i:=0到高(字段)do 备注.添加(格式(“%s:%s::%s”)[ 字段[i].Name.PadRight(NameWidth,PaddingChar), 字段[i].FieldType.ToString.PadRight(FieldTypeWidth,PaddingChar), 字段[i].GetValue(实例).ToString.PadRight(FieldTypeWidth,PaddingChar)]); 结束; 程序TForm3.按钮2单击(发件人:ToObject); 变量 我的记录:特米雷科德; MasterCtrl:TMasterCtrl; 开始 myRecord.name:=“Fred Bloggs”; myRecord.age:=23岁; MasterCtrl.MyRecord:=@MyRecord; RTTIDump(Addr(MasterCtrl),TypeInfo(TMasterCtrl),Memo1.line,18,18,0',); 结束;

Delphi 包含记录指针的访问冲突RTTI转储记录 使用RTTI; 类型TMyRecord=打包记录 名称:字符串[20]; 年龄:整数; 结束; 类型TMasterCtrl=打包记录 MyRecord:^TMyRecord;//可以通过更改为“MyRecord:指针”来避免错误` 结束; 过程RTTIDump(实例,ATypeInfo:Pointer;Memo:TStrings;NameWidth,FieldTypeWidth,ValueWidth:Integer;PaddingChar:Char); 变量 rType:trttype; 领域:焦油; i:整数; 开始 rType:=TRTTIContext.Create.GetType(ATypeInfo); Memo.Add(rType.ToString); 字段:=rType.GetFields; 对于i:=0到高(字段)do 备注.添加(格式(“%s:%s::%s”)[ 字段[i].Name.PadRight(NameWidth,PaddingChar), 字段[i].FieldType.ToString.PadRight(FieldTypeWidth,PaddingChar), 字段[i].GetValue(实例).ToString.PadRight(FieldTypeWidth,PaddingChar)]); 结束; 程序TForm3.按钮2单击(发件人:ToObject); 变量 我的记录:特米雷科德; MasterCtrl:TMasterCtrl; 开始 myRecord.name:=“Fred Bloggs”; myRecord.age:=23岁; MasterCtrl.MyRecord:=@MyRecord; RTTIDump(Addr(MasterCtrl),TypeInfo(TMasterCtrl),Memo1.line,18,18,0',); 结束;,delphi,pointers,record,dump,rtti,Delphi,Pointers,Record,Dump,Rtti,如何修复此代码将创建的访问冲突,仍然使用指针记录?您需要为指针使用正确的类型声明 uses RTTI; type TMyRecord = packed record name : String[20]; age : Integer; end; type TMasterCtrl = packed record MyRecord: ^TMyRecord; // Error can be avoided by changing to `MyRecord: Pointer;` end

如何修复此代码将创建的访问冲突,仍然使用指针记录?

您需要为指针使用正确的类型声明

uses RTTI;

type TMyRecord = packed record
  name : String[20];
  age  : Integer;
end;

type TMasterCtrl = packed record
  MyRecord: ^TMyRecord;  // Error can be avoided by changing to `MyRecord: Pointer;`
end;

procedure RTTIDump(Instance, ATypeInfo: Pointer; Memo: TStrings; NameWidth, FieldTypeWidth, ValueWidth: Integer; PaddingChar: Char);
var
  rType: TRTTIType;
  fields: TArray<TRttiField>;
  i: Integer;
begin
  rType := TRTTIContext.Create.GetType(ATypeInfo);
  Memo.Add(rType.ToString);
  fields := rType.GetFields;
  for i := 0 to High(fields) do
    Memo.Add(Format('%s: %s :: %s', [
      fields[i].Name.PadRight(NameWidth, PaddingChar),
      fields[i].FieldType.ToString.PadRight(FieldTypeWidth, PaddingChar),
      fields[i].GetValue(Instance).ToString.PadRight(FieldTypeWidth, PaddingChar) ]));
end;

procedure TForm3.Button2Click(Sender: TObject);
var
  myRecord    : TMyRecord;
  MasterCtrl: TMasterCtrl;
begin
myRecord.name := 'Fred Bloggs';
myRecord.age  := 23;

MasterCtrl.MyRecord := @myRecord;

RTTIDump(Addr(MasterCtrl), TypeInfo(TMasterCtrl), Memo1.Lines, 18, 18, 0, ' ');
end;

正如LU RD所说,您必须为
TMyRecord
声明正确的指针类型,才能为
TMasterCtrl.MyRecord
字段生成正确的RTTI,否则
字段.FieldType
属性会崩溃,因为没有可检索的类型信息

type
  PMyRecord =^TMyRecord;
  TMyRecord = packed record
  name : String[20];
  age  : Integer;
end;

type TMasterCtrl = packed record
  MyRecord: PMyRecord;  
end;
  • 不要调用
    rType.Free
    TRttiContext
    拥有它并将为您释放它


  • 请不要在没有解释它的实际问题、哪行代码失败、错误消息等的情况下发布随机代码。下次我将在第9行的问题“如何修复此代码将创建的访问冲突,仍然使用指针记录?”之前的结尾处添加注释“可以通过更改为
    MyRecord:Pointer;
    ”来避免错误?”Happy?我不明白为什么要使用短字符串,或者你为什么要打包你的记录我正在阅读的文件就是这样做的……你不必让你的内部记录保持一致。不检查
    字段[i].FieldType
    在使用前是否已分配。@NicholasRing:但人们通常不会期望
    FieldType
    失败。这是RTTI生成中的一个侥幸,而不是检索。这不是侥幸,而是RTTI生成中的一个错误,因此测试它是否被分配是一种预防措施。
    type
      PMyRecord = ^TMyRecord; // <-- here
      TMyRecord = packed record
        name : String[20];
        age  : Integer;
      end;
    
      TMasterCtrl = packed record
        MyRecord: PMyRecord;  
      end;
    
     fields[i].GetValue(Instance)