Сбросить все значения по умолчанию в динамическом массиве - PullRequest
1 голос
/ 11 мая 2019

Пожалуйста, посмотрите на мой код:

var
  b: array of Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(b,3); //All values are False by default
  b[0]:=True;
  //Do something here
  SetLength(b,0);
  SetLength(b,3); 
end;

Я проверял и b[0]=False.

Мой вопрос: используется ли SetLength(b,0), а затем SetLength(b,n) правильный способ сброса всех значений по умолчанию (False)? b[0]=False во всех случаях или True в некоторых случаях?

1 Ответ

3 голосов
/ 11 мая 2019

SetLength() инициализирует нулями память, которую она выделяет, так что да, логические значения всегда будут False по умолчанию.

При этом вместо того, чтобы вообще перераспределять массив, рассмотрите возможность сброса логических значений вручную:

var
  b: array of Boolean;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: integer;
begin
  SetLength(b,3); //All values are False by default
  b[0] := True;
  //Do something here
  for I := 0 to High(b) do
    b[I] := False; // or Default(Boolean)
end;

Или вы можете заполнить выделенную память нулями, используя FillChar() или ZeroMemory():

var
  b: array of Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(b,3); //All values are False by default
  b[0] := True;
  //Do something here
  ZeroMemory(@b[0], Length(b)); // or FillChar(b[0], Length(b), $0);
end;
...