首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-09-01 
请教 删除动态数组元素的问题typeTGroundItems packed recordItemsID:DWORDName:stringX,Y:Wordtime:

请教 删除动态数组元素的问题
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;

热点排行