我有这个功能' 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;
我在网站上看到过各种类似的问题,但是它们的错误出现在过程/函数参数的变量中,而不是变量部分。
如果你能告诉我这个问题,我们将不胜感激。
提前致谢。
答案 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);