2016-05-25 7 views
2

パラメータで同じ関数定義を値で呼び出すことはできますが、後で実行時に参照で呼び出すことはできますか? のようなもの:同じ関数を値で参照してDelphiで参照する

function myfunc(a:string); 
begin 
a:='abc'; 
end; 
... 
later: 
b:='cde'; 
myfunc(b); 
caption:=b; //prints 'cde' 
... 
later: 
myfunc(@b); 
caption:=b; //prints 'abc' 

??

答えて

8

同じの機能、あなたは、例えば、代わりにオーバーロード関数を使用する必要があります。

function myfunc(a: string); overload; 
begin 
    // use a as needed, caller is not updated... 
    a := 'abc'; 
end; 

function myfunc(a: PString); overload; 
begin 
    // modify a^ as needed, caller is updated... 
    a^ := 'abc'; 
end; 

b := 'cde'; 
myfunc(b); 
Caption := b; //prints 'cde' 

b := 'cde'; 
myfunc(@b); 
Caption := b; //prints 'abc' 
2

あなたの関数が原因で、それはだ道を参照して呼び出すことができないことをまずノート宣言された。

function myfunc(var a: string); overload; 

しかし、あなたは同じ機能を呼び出したい場合は、あなたがのコピーである廃棄変数と関数を呼び出す必要があります:あなたはこれを変更する必要があります

function myfunc(a: string); overload; 

入力。

あなたは自明あなたのための最初のラップとrefの変化によって破棄され第二の機能を作成することができますしかし
b := 'cde'; 
discard := b; 
myfunc(discard); 
caption := b; //uses 'cde' 

:レミーの答えとは違って、これは別の関数名を使用しないことを、

function myfunc2(s: string); 
begin 
    Result := myfunc(s); 
end; 

//Now the earlier code becomes: 
b := 'cde'; 
myfunc2(b); 
caption := b; //uses 'cde' 

注意をコンパイラは2つの関数のうちのどれを呼び出すかを検出できないため、オーバーロードが発生します。しかし、私は強く、これは良いことだと主張するだろう。あなたのプログラムの保守性のためにできる最悪の事の一つは、根本的に異なる機能を同じ名前で書くことです。特定のコード行で何が起こっているのかを把握するのは非常に紛らわしいものです。

+0

ありがとう、私は例えばmyfunc(a、b)のようなものを聞いて、myfunc(c + 2-pi、d + c-3)またはmyfunc(byref(c)、d + c -3)。出来ますか? (ここで 'byref'は私が必要とする '魔法の機能'です) –

+0

@danmateiあなたの質問にあなたが言ったようなものは何もありません。参照パラメータを探していない、コールバック関数を探している。私はあなたに新しい質問をすることをお勧めします。この時間はあなたが探しているもののより良い説明を提供します。 –

関連する問題