如何在delphi中更改布尔数组的值

时间:2014-05-19 14:34:09

标签: arrays delphi

我正在使用Delphi XE5制作一个小型Delphi程序。在我的代码中有一个动态布尔数组,我无法更改某些数组元素的值。我设定了它的长度后尝试初始化阵列,但它没有帮助。以下是代码的一部分:

procedure DoSomething(names: array of string);
var startWithA: array of Boolean;
    i: integer;
begin
    SetLength(startWithA, Length(names)); // each element is false by default
    for i := 0 to Length(names) - 1 do begin
       if (names[i].indexOf('A') = 0) then begin
          startWithA[i] := true; // the value is not changed after executing this line
       end;
    end;
end;

1 个答案:

答案 0 :(得分:4)

你的代码绝对正常。以下是证据:

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

function StartsWithAIndices(const Names: array of string): TArray<Boolean>;
var
  i: Integer;
begin
  SetLength(Result, Length(Names));
  for i := 0 to high(Result) do begin
    if (Names[i].IndexOf('A') = 0) then begin
      Result[i] := true;
    end;
  end;
end;

var
  Indices: TArray<Boolean>;
  b: Boolean;

begin
  Indices := StartsWithAIndices(['Bob', 'Aaron', 'Aardvark', 'Jim']);
  for b in Indices do begin
    Writeln(BoolToStr(b, True));
  end;
  Readln;
end.

<强>输出

False
True
True
False

也许你的困惑源于你分配给一个局部变量的数组并且永远不会读取其值的事实。如果你从未读过它们,怎么能说数组值没有被修改?或者您可能已启用优化,编译器决定优化其值写入但从未读取的局部变量。

顺便说一下,你的功能可以更简单地写成:

function StartsWithAIndices(const Names: array of string): TArray<Boolean>;
var
  i: Integer;
begin
  SetLength(Result, Length(Names));
  for i := 0 to high(Result) do begin
    Result[i] := Names[i].StartsWith('A');
  end;
end;