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

Delphi 实际var参数和形式var参数的类型必须相同,delphi,types,parameters,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

我有一个函数“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处显示了一个错误,i是在'var'部分声明的'for'循环的变量“Potentia”是我放在上面的另一个函数,它代替了“power(base,exp)”,所以我可以用整数计算power

function potencia(var base,exp: integer):integer;
我在网站上看到过各种类似的问题,但它们的错误出现在程序/函数参数的变量中,而不是变量部分

如果你能就这个问题给我建议,我将不胜感激


提前感谢。

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

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

将引用调用者变量的
var
参数和作为调用者变量副本的pass-by-value参数考虑在内

所有这些的结果是,
var
参数必须传递给实际变量。不能传递文本值。这就是编译器消息告诉您的

代码中的任何参数都不应是
var
参数。声明如下函数:

function bintoint(n: string):integer;
function potencia(base,exp: integer):integer;
或者可能经过
const
。这在语义上与普通值相同,只是函数不能修改参数的本地副本

function bintoint(const n: string):integer;
function potencia(const base,exp: integer):integer;
最后,
Trim
是一个返回经过修剪的字符串的函数。它不修改其参数。你的意思是写:

n := Trim(n);

您必须将变量传递给
potentia
函数,而不是常量。或者,如果不更改该函数中的
base
exp
参数,只需从其定义中删除
var
,或在函数中声明它们为
const
。顺便说一句,
Trim
是一个返回新字符串的函数,而不是一个就地编辑传递给它的字符串的过程。同样地,您可以删除
var
并执行
n:=Trim(n)
,或者将其替换为
const
,并添加一个新的本地字符串变量,然后将
Trim
调用分配给它。好的,非常感谢您的回答。抱歉,我误解了var关键字的用法。还有,我忘了修剪绳子的细节了,谢谢你提醒我。