如何对比两个结构体是否相同?

l0v3_y1n9 2012-05-20 07:49:32

type
TXX= packed record
bUpdateUp: Boolean;
end;
TTestAds = packed record
Len1: DWORD;
Len2: DWORD;
Len3: DWORD;
XX: array of TXX;
end;



var
s1, s2: TTestAds;
begin
//定义两个TTestAds结构,但他们赋值各不相同,如何判断他们是否相同?
if not CompareMem(@s1, @s2, SizeOf(TTestAds)) then //用CompareMem无法对比
begin
CopyMemory(@s1, @s2, SizeOf(TTestAds));
WriteLn('Update');
end;
end;
...全文
819 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzca 2012-05-21
  • 打赏
  • 举报
回复
很晚了, 大概其给我写个小例子,自己研究吧。
明天没事的话,我可以帮你研究下。。。以前还真没注意过这方面。
procedure TForm1.Button3Click(Sender: TObject);
type
TXX = packed record
bUpdateUp: Boolean;
end;

TTestAds = packed record
Len1: DWORD;
Len2: DWORD;
Len3: DWORD;
XX: array of TXX;
end;

var
s1, s2: TTestAds;
FType: TRttiType;
FRecordType: TRttiRecordType;
FField: TRttiField;
FContext: TRttiContext;
Val1, Val2: TValue;
i: Integer;
begin
s1.Len1 := 1;
s1.Len2 := 2;
s1.Len3 := 3;
SetLength(s1.XX, 2);
s1.XX[0].bUpdateUp := True;
s1.XX[1].bUpdateUp := False;
s2.Len1 := 2;

// RTTI反射
// FContext := TRttiContext.Create;
FType := FContext.GetType(TypeInfo(TTestAds));
for FField in FType.GetFields do
begin
Memo1.Lines.Add('FieldType=' + FField.FieldType.ToString); //FieldType=:TTestAds.:1
if FField.FieldType.IsRecord then
begin
// 把这里做成函数递归吧
end;

Val1 := FField.GetValue(@s1);
Val2 := FField.GetValue(@s2);
if Val1.IsArray then
begin
for i := 0 to Val1.GetArrayLength - 1 do
begin
Memo1.Lines.Add(Format('%s[%d] = %s', [FField.Name, i, Val1.GetArrayElement(i).ToString]));
end;
end
else
Memo1.Lines.Add(FField.Name + ' = ' + Val1.ToString);
end;
// FContext.Free;
end;
wzca 2012-05-21
  • 打赏
  • 举报
回复
二个办法
1.如果是Delphi2010或以后的版本,可以用RTTI反射record
不过,你这大记录套着小记录的。还有数组什么的。有点麻烦,递归,循环什么。。。。。
2.自写个比较的函数,一项一项的比较
l0v3_y1n9 2012-05-21
  • 打赏
  • 举报
回复
感谢8楼 我是用D7的 所以你的代码帮不到我 不过还是十分感谢.
感谢BambooCaep 感谢大家!
cdchq 2012-05-21
  • 打赏
  • 举报
回复
应该一项一项的比较
BambooCaep 2012-05-20
  • 打赏
  • 举报
回复
if p1 <> p2 then
比较p1^和p2^
BambooCaep 2012-05-20
  • 打赏
  • 举报
回复
若指针不相同则比较指针指向的内容。
l0v3_y1n9 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

把结构体分成两部分,一部分是简单类型,一部分是指针类型。简单类型的结构体可以用comparemem,你只需要比较指针类型。
[/Quote]

弱弱问一句 指针怎么比较?
BambooCaep 2012-05-20
  • 打赏
  • 举报
回复
把结构体分成两部分,一部分是简单类型,一部分是指针类型。简单类型的结构体可以用comparemem,你只需要比较指针类型。
l0v3_y1n9 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

带指针的结构不能这么比较的。
应该先比较Len1,Len2,Len3。如果都相同,再比较XX的长度(注意有可能为nil),最后比较xx的内容。
[/Quote]

实际上 这个结构我这里只是简写了 里面的成员还有好多没有列出来 这种对比太麻烦了
BambooCaep 2012-05-20
  • 打赏
  • 举报
回复
带指针的结构不能这么比较的。
应该先比较Len1,Len2,Len3。如果都相同,再比较XX的长度(注意有可能为nil),最后比较xx的内容。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧