这个错误是怎么一回事(50分)

  • 主题发起人 主题发起人 FreeFly
  • 开始时间 开始时间
F

FreeFly

Unregistered / Unconfirmed
GUEST, unregistred user!
一个很简单的小程序
program Queue;

{$APPTYPE CONSOLE}
type
PMyQueue = ^TMyQueue;
TMyQueue = class
ID : integer;
next : PMyQueue;
end;

procedure Test(var Head : TMyQueue);
var
Sec : PMyQueue;
begin
New(Sec);
Sec^.ID := 3;
Head.next := Sec;
end;

var
MyHead : TMyQueue;
begin
MyHead := TMyQueue.Create;
MyHead.ID := 1;
Test(MyHead);

writeln('Head ID is',MyHead.ID);
writeln('Sec ID is',MyHead.next^.ID);

write('Press any key to return');
readln;
end.
但程序运行到sec^.ID := 3;是就出错,
调试发现sec^=nil,这是怎么回事?
如果把
TMyQueue = class
改成
TMyQueue = record
去掉 MyHead := TMyQueue.Create;
程序运行就对了,请问这是怎么回事?
 
你好象把class和record搞混了
 
你没有给你定义的类分配空间
 
New不能用于创建类
New(Sec);改为 Sec:=TMyQueue.Craete 就没问题了。

建议你还是用record,class比record多很多东西。你这里看来用不上
 
如果将Test中的程序改成这样
procedure Test(var Head : TMyQueue);
var
Sec : TMyQueue;
begin
Sec := TMyQueue.create;
Sec.ID := 3;
Head.next := @Sec;
end;
那么在后面 writeln('Sec ID is',MyHead.next^.ID);
时又会出错,好像不能使用指向一个类实例的指针去访问这个实例.
那么怎么用指针来访问类实例?
 
这是学C/C++的人用Delphi时常犯的"错误",想当年我也犯过 :-)
Delphi中的类已经是"指针"了!不要再用@之类方法求指针。

type
TMyQueue = class
ID : integer;
next : TMyQueue;
end;

就可以了。
 
这个用法还没见过,明明是record,你为什么非弄成class?
 
呵呵,链表还是记录的好,然后用 TList 封装一下,
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
948
import
I
I
回复
0
查看
763
import
I
后退
顶部