我一定是错过了一些很容易的东西?我正在尝试在Delphi 3应用程序中创建一个链接列表。
这是通过两个类ItemList和Item实现的。ItemList在表单创建时被实例化。它在形态的生命中持续存在。根据需要实例化每个Item对象。表单有一个名为AddAcc的函数。AddAcc是通过窗体控件之一的on-change事件调用的。
在此更改事件期间发生了什么:
的尾部
我已经测试过AddItem,它运行得很好。我的问题是,每次调用*AddAcc*时,它都获得相同的内存位置。我尝试过不同的方法来创建一个新的Item对象。我使用了New,GetMem (w/ FillChar),并实例化了一个类型为Item的局部变量。所有对AddAcc的调用都会导致获得相同的内存位置。
我直接(通过引用)将Item对象传递给AddItem,或者传递指向Item对象的指针。
我认为,链接列表中对Item对象实例的引用(指针)将确保项目的内存位置得到维护。但是,一旦AddAcc类退出,它就会被收集起来。
FUNCTION AddAcc;
Var
accItem : ptrItem;
BEGIN
GetMem(accItem, sizeOf(Item));
FillChar(accItem^, sizeof(Item), 0);
ItemList.AddItem(accItem^);
End;
Procedure TItemList.AddItem(Var newItem : TAccessoryItem);
begin
Inc(_count);
// add first item to the list
If (_count = 1) Then
begin
_fifoHead := @newItem;
_tail := @newItem;
newItem.Next := @_tail;
newItem.Previous := @_fifoHead;
exit;
end;
_tail^.Next := @newItem;
newItem.Previous := _tail^;
mewItem.Next := @_tail;
_tail := @newItem;
end;任何帮助都是非常感谢的。
发布于 2011-03-05 13:51:05
下面是我如何写一个链接列表:
type
PItem = ^TItem;
TItem = record
Next: PItem;
Data: Integer;
end;
procedure Add(var First: PItem; Data: Integer);
var
NewItem: PItem;
begin
New(NewItem);
NewItem.Next := First;
NewItem.Data := Data;
First := NewItem;
end;
...
var
First: PItem;
begin
First := nil;
Add(First, 42);
//etc.
end;当您需要释放您的列表时,您可以这样做:
var
Item: PItem;
begin
while Assigned(First) do begin
Item := First;
First := Item.Next;
Dispose(Item);
end;
end;我相信这是在Pascal中编写链接列表类型代码的典型方法。
我有意为这个最简单的链接列表编写了这段代码。这使您能够集中精力于指针的分配、使用等等。您似乎已经知道如何维护更复杂的列表中的引用,因此我相信您将毫不费力地使这种风格的代码适应您的需要。
https://stackoverflow.com/questions/5203899
复制相似问题