读书人

请问 删除动态数组元素的有关问题

发布时间: 2012-09-01 09:33:02 作者: rapoo

请教 删除动态数组元素的问题
type
TGroundItems = packed record
ItemsID:DWORD;
Name:string;
X,Y:Word;
time:Cardinal;
end;


var
FFieldItems:array of TGroundItems; //地面物品黑名单数组

procedure DeleteFFieldItems; //删除动态数组元素
var
Count: Cardinal; //tarr数组长度
index: Integer; //要删除的数组索引,FfielditemsO数组
iii:Integer;
begin
EnterCriticalSection(MyCs); //进入临界区
try //刷新数据后,把 超时的物品删除掉
for iii := low(FFieldItems) to high(FFieldItems) do
begin
if (gettickcount - FFieldItems[iii].time > 180000 ) and (FFieldItems[iii].ItemsID >0) then
begin
// Form1.Memo15.Lines.Add('删除掉不存在的物品'+ffielditems[iii].name);
Count := Length(FFieldItems);
index := iii;
if (Count = 0) or (Index < 0) or (Index >= Count) then exit;
Move(FFieldItems[Index+1], FFieldItems[Index], (Count-Index)* SizeOf(FFieldItems[0]));
SetLength(FFieldItems, Count - 1);
end;
end;
finally
LeaveCriticalSection(MyCs); //离开临界区
end;
end;


在执行删除数组元素时,总会过一段时间就产生读写地址错误,请问删除操作,那段代码不对,请各位朋友指教一下

[解决办法]
Downto
[解决办法]
代码逻辑又点问题:
for 循环和SetLength 相抵触,使得for 循环读取不存在的成员

另外根据这里的判断:
if (gettickcount - FFieldItems[iii].time > 180000 ) and (FFieldItems[iii].ItemsID >0)
这个循环可能要去掉不止一个成员

所以用repeat until 循环:
iii:=0;
repeat
....
inc(iii);
until iii=count;

读书人网 >.NET

热点推荐