如何在Delphi中将字符串数组作为参数传递给函数

3

我希望你能帮我解决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的初学者,但这真的很令人困惑。


你可以看一下这篇文章:http://rvelthuis.de/articles/articles-openarr.html - MartynA
1
你为什么还在使用 AnsiString? - David Heffernan
@DavidHeffernan 这个重要吗?对于字符串数组也有同样的问题。 - Adam Mrozek
当您的程序开始接收非ASCII数据时,这将变得非常重要。 - David Heffernan
1个回答

9

你的第二个例子在功能上与第一个例子不完全相同。

第一个例子是正确的。该函数以开放数组作为输入参数,并且直接在该参数中构造了一个固定的字符串数组,这是完全可以的。任何数组类型都可以传递给开放数组参数。

在第二个例子中,你声明了一个动态字符串数组,但你没有为该数组分配任何内存,并且尝试将其第一个元素(即单个字符串)指向固定字符串数组。然后你尝试将该元素(再次是单个字符串)传递到需要数组的位置。这就是为什么代码无法编译的原因。

编写过程的正确方式更像是这样:

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接