Как я могу передать массив строк как параметр для работы в delphi

У меня проблема с Делфи.

Я написал такую ​​функцию:

function MyFunction(arr: array of AnsiString): Boolean;
begin
  //code here
end;

И теперь, когда я передаю массив AnsiString прямо в функцию, вот так, все работает отлично:

MyFunction(['one', 'two', 'three']);

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

var arr: array of AnsiString;

procedure MyProcedure;
begin
  arr[0] := ['one', 'two', 'three'];
  MyFunction(arr[0]);
end;

Возникла ошибка несоответствия.

Я новичок в Delphi, но это действительно сбивает с толку.


person Adam Mrozek    schedule 21.12.2017    source источник


Ответы (1)


Ваш второй пример функционально не идентичен первому примеру.

Первый пример хорош. Функция принимает открытый массив в качестве входного параметра, и вы создаете фиксированный массив строки непосредственно в этом параметре, что совершенно нормально. Любой тип массива может быть передан в параметр открытого массива.

Во втором примере вы объявляете динамический массив строк, но вы не выделяете памяти для массива и пытаетесь присвоить его первому элементу (который представляет собой одну строку) указание на фиксированный массив строк. И затем вы пытаетесь передать этот элемент (опять же, одну строку), где ожидается массив. Вот почему код не компилируется.

Правильный способ написания вашей процедуры будет выглядеть примерно так:

procedure MyProcedure;
var
  arr: array of AnsiString;
begin
  SetLength(arr, 3);
  arr[0] := 'one';
  arr[1] := 'two';
  arr[2] := 'three';
  MyFunction(arr);
end;

В качестве альтернативы:

procedure MyProcedure;
var
  arr: array of AnsiString;
begin
  arr := ['one', 'two', 'three'];
  MyFunction(arr);
end;

В качестве альтернативы:

type
  TAnsiStringArray = array of AnsiString;

procedure MyProcedure;
var
  arr: TAnsiStringArray;
begin
  arr := TAnsiStringArray.Create('one', 'two', 'three');
  MyFunction(arr);
end;
person Remy Lebeau    schedule 21.12.2017