加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 05:22:16 所属栏目:大数据 来源:网络整理
导读:我最初有一个定义为全局变量的数组[1..1000]。 但现在我需要的是n,而不是1000,我没有找到n直到后来。 我知道在我填充阵列之前n是什么,但我需要它是全局的,因此需要一种方法来定义运行时全局数组的大
我最初有一个定义为全局变量的数组[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代码示例。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读