【问题标题】:Delphi var parameter setting length from inside of procedure程序内部的Delphi var参数设置长度
【发布时间】:2016-04-21 06:27:43
【问题描述】:

我正在尝试将一些字符串传递给动态字符串数组,在这种情况下它正在工作:

procedure DoSomeThing(in_cmd: string; var out_strs: array of string);
begin
  ..
  for n := low(out_strs) to high(out_strs) do
    begin
      out_strs[n] :='bla bla';
    end;
end;

在应用中使用 as:

.
.
.
SetLength(my_out_str, sizer);

DoSomeThing('do it now', my_out_str);
.
.

但我想从程序中my_out_str SetLength。 有可能吗?

【问题讨论】:

  • 阅读:stackoverflow.com/questions/22140387 这是一个众所周知的问题,它的根源是在非常非常非常古老的时代,当时 Pascal(甚至还没有 Delphi)根本没有动态数组......

标签: delphi


【解决方案1】:

是的,这是可能的,但您必须使用先前定义的动态数组类型声明参数。您目前使用的是open array

type
  TStrDynArray = array of string;

procedure DoSomeThing(in_cmd:string; var out_strs: TStrDynArray);
begin
  SetLength(out_strs, 2 * Length(inn_cmd));
  ...

或者,如果泛型可用,则使用 TArray<string>(来自 Delphi 2009)

procedure DoSomeThing(in_cmd:string; var out_strs: TArray<string>);
begin
  SetLength(out_strs, 2 * Length(inn_cmd));

原因是array of x 在一种情况下与array of x 在另一种情况下不同。

在类型声明中

type
  TDynamicArray = array of string; 

是动态数组类型,可以调整大小。 Delphi 4 中引入了动态数组。

在参数定义中

procedure Test(var X: array of string);

open array parameter,这意味着它将接受不同大小的数组作为输入。它只需要一个指向第一个元素的指针(即引用),以及数组中最后一个元素的索引。它不知道也不关心输入数组是动态数组还是静态数组,因此不允许调整长度。

开放数组参数早于 Delphi 1。

进一步阅读
http://rvelthuis.de/articles/articles-openarr.html

【讨论】:

  • 感谢您提及这篇文章。
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2021-09-26
  • 2012-05-01
  • 1970-01-01
  • 2016-12-02
相关资源
最近更新 更多