计算数组中有多少个元素

用户名

是否有任何方法可以通过使用代码来计算数组中有多少个元素?

例如:

arrName   : array[1..20] of string;

我已经知道该数组中存储了6个名称,但是如何使用编码来确定呢?

约翰

是的,但前提是该数组包含托管类型。
看一下下面的代码示例。

procedure TForm1.Button1Click(Sender: TObject);
var
  sa: array[0..19] of string;
  i: Integer;
begin
  for i := 0 to 5 do
    sa[i]:= 'test'+IntToStr(i);
  for i := 6 to High(sa) do begin
    if sa[i] <> '' then ShowMessage('oops');  //will never be triggered.
  end;
end;

请注意,空字符串又''是有效字符串。如果允许程序在此数组中存储空字符串,则方案将失败;否则,方案将失败。如果是这样,则需要使用占位符字符串初始化数组。

托管类型初始化为空
在调试此示例并打开CPU窗口时,您将看到以下初始化代码:

Unit1.pas.30: begin
005C9B24 55               push ebp
005C9B25 8BEC             mov ebp,esp
......
005C9B3F E8F811E4FF       call @InitializeArray
......
Unit1.pas.31: for i := 0 to 5 do

在该begin语句中进行调用,InitializeArray因为该数组包含string

如果数组包含:stringinterfacedynamic arrayvariantanonymous method(或含任何这些记录),那么它会被初始化。

非托管类型不会初始化
如果数组包含其他内容,它将不会初始化;表示它将包含该段内存中的所有内容。

procedure TForm1.Button1Click(Sender: TObject);
var
  sa: array[0..19] of integer;
  i: Integer;
begin
  for i := 0 to 5 do
    sa[i]:= i+1;
  for i := 6 to High(sa) do begin
    //will most likely be triggered
    if sa[i] <> 0 then ShowMessage('no init for integer');  
  end;
end;

(显然,**dynamic** array(没有预设界限的数组)在使用前和扩展时将被清零)

这不适用于类成员
当创建对象(该类的实例)时,该类的所有成员(aka字段)都初始化为零。
全局变量也初始化为零。方法本地变量不是。

聪明的编程
如果您因某种原因被迫使用固定长度的数组来存储可变数量的字符串,那么遍历该数组来计算项目数是很浪费的。
最好有一个计数器来跟踪元素的数量。

type
  TNames = record
    count: integer;
    items: array[0..20] of string;
  end;

否则,您将陷入画家的陷阱Schlemiel中一种众所周知的反模式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章