实际和正式var参数的类型必须相同

时间:2014-03-16 14:50:04

标签: delphi types parameters

我有这个功能' bintoint'我用它来将二进制数转换为十进制数:

function bintoint(var n: string):integer;
var i: integer;
Begin
result:= 0;
Trim(n);
for i:=length(n) downto 1 do
  result := result + (strtoint(n[i])*(potencia(2,i-1)));  {Here's the source for the error, at the last 'i'}
End;

它在i处显示错误,这是' for'的变量。循环,在' var'部分。 ' potencia'是我放在上面的另一个功能,取代了权力(基础,exp)'所以我可以用整数计算功率。

function potencia(var base,exp: integer):integer;

我在网站上看到过各种类似的问题,但是它们的错误出现在过程/函数参数的变量中,而不是变量部分。

如果你能告诉我这个问题,我们将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:5)

我认为你对var在函数参数列表中的含义有误解。在此设置中,var用于指示参数是通过引用传递的。这意味着调用者可以看到函数中的修改。将此与传递值进行对比,其中在函数中进行的修改不会修改调用者传递的变量。

我怀疑您认为必须使用var声明参数,就像本地变量一样。事实并非如此。编程语言关键字通常是上下文敏感的,并且根据它们出现的位置具有不同的含义。

考虑一个引用调用者变量的var参数,以及一个pass by value参数作为调用者变量的副本。

所有这一切的结果是必须将var参数传递给实际变量。您无法传递文字值。这就是编译器消息告诉你的。

您的代码中的所有参数都不应该是var个参数。声明这样的函数:

function bintoint(n: string):integer;
function potencia(base,exp: integer):integer;

或者也许经过const。除了函数不能修改其参数的本地副本外,这在语义上与plain by value相同。

function bintoint(const n: string):integer;
function potencia(const base,exp: integer):integer;

最后,Trim是一个返回修剪过的字符串的函数。它不会修改其参数。所以你的意思是写:

n := Trim(n);