记录类型的变量不能直接做比较吗?(100)

  • 主题发起人 labixiaoxin
  • 开始时间
L

labixiaoxin

Unregistered / Unconfirmed
GUEST, unregistred user!
记录类型的变量不能直接做比较吗? 如下代码在执行时报错: Tbb = record a: integer
b: integer
c: string
d: array of byte
end
i, j: Tbb
if i = j then //这里报错 'Incompatible types' begin // end
请问是不是记录类型的变量不能直接做比较,难道要一个个域手工比较?如果域很多,而且以后给这个记录增加域后,有可能会忘记把新加入的域也作为比较对象,这样通用性就降低了。有什么好的办法对记录类型的变量进行直接比较,谢谢。
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
没办法。因为是指针。
 
T

tseug

Unregistered / Unconfirmed
GUEST, unregistred user!
如果你的记录类型里不包含指针及动态类型(动态数组、Variant、String等),可以用内存比较
 
L

labixiaoxin

Unregistered / Unconfirmed
GUEST, unregistred user!
我记得一本大概叫DELPHI专家门诊的书有专门的章节说这个问题,可是我这里找不到这本书。有没有看过这本书这个问题的大富翁给点指导?
 
A

apiao

Unregistered / Unconfirmed
GUEST, unregistred user!
没什么麻烦的,是编译器的限制而已变通下 if CompareMem(@i, @j, SizeOf(Tbb)) then begin ShowMessage('ok')
end;tseug 说的有道理,这个记录里面别含有不定长的数据类型。至于指针类型的,只能确定指针是否相等,内容就管不了那么多了。
 
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
@白河愁记录类型是在栈分配内存,所以说是指针不一定正确当然Record里面的内容有可能是指针,比如string类型
 
L

labixiaoxin

Unregistered / Unconfirmed
GUEST, unregistred user!
我的记录里面刚好是有string和动态数组的。这个就麻烦了。我记得一本大概叫DELPHI专家门诊的书有专门的章节说这个问题,可是我这里找不到这本书
 
S

Supermay

Unregistered / Unconfirmed
GUEST, unregistred user!
用d2009,然后操作符重载,
 
Z

zjan521

Unregistered / Unconfirmed
GUEST, unregistred user!
直接比较内存必须很明确所有的字段都是ALIGN的,否则其中的空洞会导致隐藏的危机。因此这个做法相当危险,其使用需要严格控制。
 
G

GodIsWrong

Unregistered / Unconfirmed
GUEST, unregistred user!
个人认为要想比较的话,可以写成类,定义一个比较函数不就行了
 
L

labixiaoxin

Unregistered / Unconfirmed
GUEST, unregistred user!
如果定义成类也还是要手工比较记录中的各个域呀。
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
to muhx,ctrl+alt+c 看看record传递的过程,再说。
 
G

GodIsWrong

Unregistered / Unconfirmed
GUEST, unregistred user!
写成类之后,定义一个函数呗,以后每次调用那个函数进行比较不就行了
 
Q

QQ在线

Unregistered / Unconfirmed
GUEST, unregistred user!
record在D里在可以找出对应的值来的,不过,有些麻烦操作其实有些类似:type MyData = record s: string
v: variant
arr: array of integer
arr2: array of string
arr3: array [0..1] of WideString
end;var v: MyData;New(v);v..... := ...Dispose(v);类似于操作Dispose系统函数。可以跟踪一下Dispose的操作,然后写出一个CompareRecord函数来。
 
Z

zjan521

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上的意思就是根据RTTI信息, 写一个可以比较包括String/DynArray的通用例程出来.
 
L

labixiaoxin

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 
顶部