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

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;
...全文
906 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的内容。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

16,741

社区成员

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

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