这样的比较为什么报错? ( 积分: 100 )

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

lxddd

Unregistered / Unconfirmed
GUEST, unregistred user!
type TItem=record
p0,p1,p2,p3:integer;
end;

var a:array[0..100] of TItem;
b:TItem
i:integer;

if b=a then .....
^ ----- Incompatible types
 
type TItem=record
p0,p1,p2,p3:integer;
end;

var a:array[0..100] of TItem;
b:TItem
i:integer;

if b=a then .....
^ ----- Incompatible types
 
类型不对,a是Titem类型的,写成a.P0就可以比较了
 
方法有如下几种:
1、这个b=a比较有什么意义?你不就是需要这个吗?
if (b.p0=a[0].p0) and (b.p1=a[0].p1) ... then
begin
end

2、
type
TItem=record
p0,p1,p2,p3:integer;
end;

pItem=^TItem;

procedure TForm1.Button1Click(Sender: TObject);
var a:array[0..100] of PItem;
b:PItem;
i:integer;
begin
if a[0]=a[1] then showmessage('')
end;
 
你定义并声明了记录类型及其变量。记录类型不能直接用变量名进行比较,要比较
两个记录是否相等,要逐个比较记录内的各个域的值是否相等。即使用 yf168 的代码,
声明指向记录的指针类型 pItem=^TItem;,也不能直接进行比较
( if a[0]=a[1] then showmessage('')),这样永远不会执行showmessage,因为
a中的只是地址指针,是不会(代表记录内容)相等的。
所以,只能逐个比较记录内各个域的值,可以定义一个函数,如:
function Compare(T1,T2 :TItem):Boolean;
begin
if
(T1.p0 = T2.p0) and
(T1.P1 = T2.p1) and
(T1.P2 = T2.P2) and
(T1.P3 = T2.P3) then
result :=true
else result :=false;
end;

执行时调用就可以了:
begin
if Compare(b,a) then....
end;
 
当然,Jonson_sunshine说的是对的
对于我写的第2点: 我只是演示了一下而已,当然不能解决楼主的问题!
谢谢Jonson_sunshine;
 
要是 TItem 中不包含指针、字符串、对象等,可以直接用 CompareMem:

if CompareMem(@b, @a, SizeOf(b)) then 相等;
 

Similar threads

I
回复
0
查看
734
import
I
I
回复
0
查看
482
import
I
I
回复
0
查看
596
import
I
I
回复
0
查看
875
import
I
后退
顶部