关于record自定义类型的简单问题(50分)

  • 主题发起人 主题发起人 叮叮当当
  • 开始时间 开始时间

叮叮当当

Unregistered / Unconfirmed
GUEST, unregistred user!
var
A, B: record
X, Y: Integer;
Z: array[0..2] of Byte;
end;
begin
if A <> B then ShowMessage('变量不相等!')
// 编译在此处出错
end;

问题就出在A和B是否相等的判断上,请问Delphi中record(自定义类型)的值是否可以直接用=、<>进行判断?如果不行,该怎么办?
 
类型好像不能比较,我先用DELPHI试试
 
record的内容是什么? 能否赋值,如果不能,那就不能比较了
 
有那位大哥能帮我解开以前我压缩的文件的密码,是rar的,不是zip的?
我的邮箱是jxpinfo@163.com
 
To: smallbs
record的内容上面不是写出来了么?
可以赋值的。A.X、B.Y……
 
自定义结构确实不能够互相比较。
 
TO: szf
不能比较,那怎么办?如果要判断A和B中数据的值是否相等难道一定要if (A.X = B.X) and (A.Y = B.Y) and ...?
 
确实没有办法一句话搞定。
不过你可以写一个函数,在里面判断
TMyCord = record
X,Y: Integer;
end;
......
function CompareA2B(A,B: TMycord): Boolean;
begin
Result := (A.X=B.X) and (A.Y=B.Y) and ... ...
end;
就是这么麻烦了。
 
A B是类型,你只能对A.X、B.X直接赋值,所以只能直接比较 A.X、 B.X 了
 
应该可以这样比较
if not CompareMem(@A,@B,SizeOf(A)) then
ShowMessage('变量不相等!');
 
同意,楼上的说法
 
Bxch_1000:
针对这个例子,是integer和byte的应该可以,但是如果里面有指针或者string,pchar,
用CompareMem估计就不行了。

我觉得还是应该另写一个函数,同意szf的。
 
to all:
一个奇怪的问题,DreamTiger的说法应该是正确的,string或Pchar用CompareMem
比较的应该只是地址而非内容,但我试了试居然发现还是可以比较,是什么原因呢?

var
A,B: record
S1: PChar;
S2: String;
end;
begin
A.S1:='1234';
B.S1:='1234';
A.S2:='123';
B.S2:='123';
if not CompareMem(@A,@B,SizeOf(A)) then
ShowMessage('变量不相等!')
// 相等

A.S1:='12345';
B.S1:='1234';
A.S2:='1234';
B.S2:='123';
if not CompareMem(@A,@B,SizeOf(A)) then
ShowMessage('变量不相等!')
// 不相等
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
cc= class
X, Y: Integer;
Z: array[0..2] of Byte;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
a,b:cc;
begin
if A <> B then ShowMessage('变量不相等!')
// 编译在此处出错
end;


end.
 
good question, want to know more
 
用指针嘛。
 
两个record类型是不能比较的
 
Bxch_1000:
你的程序中,A.S2和B.S2其实都是指向一个常量的地址了,所以会有这种结果。
下面的程序就可以看出结果了:

var
A,B: record
S2: String;
end;
begin
A.S2:='123';
Setlength(B.S2,3);
StrCopy(PChar(B.S2),PChar(A.S2));
if not CompareMem(@A,@B,SizeOf(A)) then
ShowMessage(A.S2 + ':' + B.S2 + ' 变量不相等!')
// 不相等
end;
 
TO Bxch_1000:
能比较的原因是你用了字符串常量。 相同的字符串常量都指向同一地址。 所以给你一种用
comparemem也能比较record中string的错觉。
 
TO Bxch_1000:
请你试一下:

type
tarecord = record
x:integer;
s:string;
end;
parecord = ^tarecord;

var
C,D:tarecord;

A,B: record
S1: PChar;
S2: String;
p:parecord;
end;
begin
C.x:=1;
C.s:='ni hao';
D.x:=1;
D.s:='ni hao';

A.S1:='1234';
B.S1:='1234';
A.S2:='123';
B.S2:='123';
A.p:=@C;
B.p:=@D;

if not CompareMem(@A,@B,SizeOf(A)) then
ShowMessage('变量不相等!')
// 相等

C.x:=1;
C.s:='ni hao';
D.x:=2;
D.s:='ni hao';

A.S1:='1234';
B.S1:='1234';
A.S2:='123';
B.S2:='123';
A.p:=@C;
B.p:=@D;

if not CompareMem(@A,@B,SizeOf(A)) then
ShowMessage('变量不相等!')
// 不相等
end;

如果还行的话就爽啦。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部