具有任意数量的双参数的过程

Mic*_*Hua 0 delphi optional-parameters

我有10个双变量,我想用值0初始化.它们是非结构化的,不是设计的数组的一部分.

procedure Initialize;
var
  a1, a2, a3, a4, a5, b1, b2, b3, b4, b5: Double;
begin
  a1 := 0; 
  a2 := 0;
  a3 := 0;
  a4 := 0;
  a5 := 0;

  b1 := 0; 
  b2 := 0;
  b3 := 0;
  b4 := 0;
  b5 := 0;
end;
Run Code Online (Sandbox Code Playgroud)

为了重构那段代码,我引入了一个辅助方法AssignValue.

procedure Initialize;
var
  a1, a2, a3, a4, a5, b1, b2, b3, b4, b5: Double;
begin
  AssignValue(0,a1); 
  AssignValue(0,a2);
  ...
end;

procedure AssignValue(value: Double; var target: Double);
begin
  target:= value;
end;
Run Code Online (Sandbox Code Playgroud)

如何编写一个更通用的AssignValue过程,它接受任意数量的参数并使调用成为AssignValue(0,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5)可能?

奖金问题:如何编写该程序,以便以任何顺序考虑doubleint引用,假设value: Int为第一个参数.

Dav*_*nan 7

你可以这样做:

procedure AssignValue(const Value: Double; const Addresses: array of PDouble);
var
  i: Integer;
begin
  for i := low(Addresses) to high(Addresses) do
    Addresses[i]^ := Value;
end;
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

AssignValue(0.0, [@a1, @a2, @a3, ...]);
Run Code Online (Sandbox Code Playgroud)

这里我们传递一个包含变量地址的开放数组.

要支持多种类型,您将使用如下声明的重载:

procedure AssignValue(const Value: Double; const Addresses: array of PDouble); 
  overload;
procedure AssignValue(const Value: Integer; const Addresses: array of PInteger); 
  overload;
// and so on, implementation of these functions is obvious
Run Code Online (Sandbox Code Playgroud)

您可以自行判断这是否比您当前的解决方案更好.就个人而言,我坚持使用普通的旧任务操作员.另一个选择是将变量放在记录中并分配Default(TMyRecord)给您的记录变量.