Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中通过值和引用调用相同的函数_Delphi - Fatal编程技术网

在Delphi中通过值和引用调用相同的函数

在Delphi中通过值和引用调用相同的函数,delphi,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' ??不是相同的函数,不是。您需要使用重载函数,例如: function myfunc(a: string);

是否可以使用参数按值调用同一个函数定义,然后在运行时按引用调用? 比如:

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

不是相同的函数,不是。您需要使用重载函数,例如:

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;


首先请注意,由于函数的声明方式,无法通过引用调用函数

function myfunc(a: string); overload;
您必须将此更改为:

function myfunc(var a: string); overload;
但如果要调用同一个函数,则需要使用作为输入副本的discard变量调用该函数

b := 'cde';
discard := b;
myfunc(discard);
caption := b; //uses 'cde'
但是,您可以创建第二个函数,该函数简单地为您包装第一个函数,并放弃by ref更改:

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

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

请注意,与Remy的答案不同,这使用了不同的函数名,而不是重载,因为编译器无法检测要调用的两个函数中的哪一个。然而,我强烈认为这是一件好事。为了程序的可维护性,最糟糕的事情之一就是编写完全不同的同名函数。弄清楚特定代码行上发生了什么会让人非常困惑。

谢谢,但我注意到了一些类似的东西,例如:myfunc(a,b),然后将其称为myfunc(c+2-pi,d+c-3)或myfunc(byref(c),d+c-3)。可能吗?(其中‘byref’是我需要的‘魔法函数’)@danmatei这和你在问题中所说的完全不同。您不是在寻找引用参数,而是在寻找回调函数。我建议你问一个全新的问题;这一次可以更好地解释你在寻找什么。
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'