0

値 0 で初期化したい double 変数が 10 個あります。これらは構造化されておらず、設計上配列の一部ではありません。

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;

そのコードをリファクタリングするために、ヘルパー メソッド 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;

AssignValue任意の数の引数を取り、呼び出しを可能にする、より一般的な手順を作成するにはどうすればよいAssignValue(0,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5)ですか?

おまけの質問:最初のパラメーターとして想定して、任意の順序で考慮doubleまたは参照できるように、その手順をどのように記述しますか。intvalue: Int

4

3 に答える 3

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;

次のように呼び出します。

AssignValue(0.0, [@a1, @a2, @a3, ...]);

ここでは、変数のアドレスを含むオープン配列を渡しています。

複数の型をサポートするには、次のように宣言されたオーバーロードを使用します。

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

これが現在のソリューションよりも優れているかどうかを判断するのはあなた次第です。個人的には、昔ながらの代入演算子を使い続けたいと思います。別のオプションは、変数をレコード内に配置Default(TMyRecord)し、レコード変数に割り当てることです。

于 2013-10-15T08:36:53.213 に答える
2

これにはオープン配列パラメーターを使用できます。

procedure AssignValue(value: double; const arr: array of PDouble);
var
  i: Integer;
begin
  for i := 0 to length(arr)-1 do
    PDouble(arr[i])^ := value;
end;

次のように使用します(そのようなタスクで「@」を回避する方法がわかりません):

AssignValue(1, [@a1,@a2,@a3]);
于 2013-10-15T08:36:40.807 に答える