【问题标题】:Delete element from a static array从静态数组中删除元素
【发布时间】:2015-11-16 09:47:00
【问题描述】:

我正在尝试从数组中删除一个项目。 数组不是动态的!

我找到了很多关于如何为动态变体执行此操作的示例,但没有找到用于静态变体的示例。

delphi 示例:

var
  A: array of integer;
begin
  ...
  A:=[1,2,3,4];
  Delete(A,1,2); //A will become [1,4]
  ...
end;

来自其他网站的示例:

type
  TIntArray = array of Integer;
procedure DeleteArrayElement(var AArray: TIntArray; const AIndex: Integer);
begin
  Move(AArray[AIndex + 1], AArray[AIndex], SizeOf(AArray[0]) * (Length(AArray) - AIndex - 1)); 
  SetLength(AArray, Length(AArray) - 1);
end;
...
//call via
DeleteArrayElement(IntArray, 3);
...

我的数组被定义为 0 .. 11 所以这不是动态的(我猜)?

当我尝试使用 SetLength 函数时,它显示类型不兼容。

知道如何解决这个问题吗?

【问题讨论】:

  • 如果要删除元素,请不要使用数组:如果可用,请使用 TList
  • 您不能从静态数组中删除/移除元素。这就是静态的意思:元素的数量是固定的。您只能更改或重新排序值。
  • 静态数组是静态的。

标签: arrays delphi pascal


【解决方案1】:

当您声明一个静态数组时,您告诉编译器应该分配并保留整个数组的内存,直到程序终止(如果分配在全局空间中)。

您无法更改静态数组的大小。这就是为什么在 Delphi 中存在动态数组的目的。

静态数组的 Embarcadero 文档说:

如果你创建了一个静态数组,但没有给它的所有数组赋值 元素,未使用的元素仍被分配并包含随机 数据;它们就像未初始化的变量。

【讨论】:

  • 是否可以说从数组中取出最后一项并用 0 填充它,如果数组用 0 填充以不显示它,请在某些函数中添加另一个检查?
  • 用零填充最后一项 -> MyArray[Length(MyArray) - 1] := 0。然后检查这个条件的另一个函数if MyArray[Length(MyArray) - 1] = 0 then
  • 请看@fantaghirocco 的评论。请采纳他的建议。这是做你想做的事情的正确和新颖的方式。
  • 静态数组不一定会在应用程序生命周期内持续存在,除非它们被声明为全局变量。作为局部变量,它们存在于堆栈中,并在方法返回时超出范围。作为对象或记录的字段,它们的生命周期取决于其父对象的生命周期。
  • @CharlieH: 而不是 Length(MyArray)-1 使用 HIGH(MyArray) - 这也将允许你有 ARRAY [7..9] 并且仍然访问最后一个条目,而 Length 会给你一个索引错误......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2018-06-29
  • 2022-01-13
相关资源
最近更新 更多