微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 当我不知道长度直到运行时,我如何声明一个数组?

我最初有一个定义为全局变量的数组[1..1000]。
但现在我需要的是n,而不是1000,我没有找到n直到后来。
我知道在我填充阵列之前n是什么,但我需要它是全局的,因此需要一种方法来定义运行时全局数组的大小。

上下文是通过对文件中的字节进行线性变换来填充数组
我不知道文件有多大,直到有人想打开它,文件可以是任何大小。

解决方法

从Delphi 4开始,Delphi支持动态数组。您可以在运行时修改它们的大小,并且它们将保留您以旧大小存储在其他元素中的数据。它们可以保存任何同类型的元素,包括记录和其他数组。您可以声明动态数组与声明正常的“静态”数组相同,但只需省略数组边界:
var
  ArthurArray: array of TForm;

虽然静态数组允许您同时指定下限和上限,但动态数组的低索引始终为零。高索引由High函数给出,它总是返回小于数组长度的一个。对于任何动态数组x,High(x)= Length(x)-1。

全局变量可以由任何代码访问,包括本地过程。

动态数组类型的全局变量将被初始化为一个空数组。它的长度将为零,而对该数组调用的高将为-1。该数组的低位仍将返回零。

在任何时候,您可以调整动态数组的大小。使用SetLength函数,就像你可以做的字符串:

var
  NumElements: Integer;
begin
  NumElements := GetNumberOfArthurForms();
  SetLength(ArthurArray,NumElements);
end;

如果您有一个多维数组,可以在循环中设置它们的长度:

var
  matrix: array of array of Double;
  i: Integer;
begin
  SetLength(matrix,height);
  for i := 0 to height - 1 do
    SetLength(matrix[i],width);
end;

一个快捷方式可以一次设置所有内部数组的长度:

begin
  SetLength(matrix,height,width);
end;

像我提到的,动态数组保持他们的旧值,当你调整它们:

var
  data: array of string;
begin
  SetLength(data,2);
  data[1] := 'foo';
  SetLength(data,20);
  Assert(data[1] = 'foo');
end;

但是如果你缩短数组,驻留在新的最后一个元素之外的任何元素都会永远消失:

begin
  SetLength(data,20);
  data[15] := 'foo';
  SetLength(data,2);
  // data[15] does not exist anymore.
  SetLength(data,16);
  writeln(data[15); // Should print an *empty* line.
end;

我上面的演示使用字符串。 Delphi中的字符串是特殊的;它们由编译器通过引用计数来管理。因此,字符串类型的新的动态数组元素被初始化为空。但是如果我使用整数代替,将不能保证新元素的值。它们可能为零,但它们也可能是其他任何东西,就像独立局部变量的初始值一样。

Delphi 7帮助文件是非常好的,我被告知。请阅读有关动态数组的更多信息。您可以在Delphi安装中提供的VCL和RTL源代码中找到它们的使用演示,以及几乎所有过去10年生成的Delphi代码示例。

原文地址:https://www.jb51.cc/delphi/103656.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐