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

Leo*_*oAM 3 delphi parameters types

我有这个函数'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;
Run Code Online (Sandbox Code Playgroud)

它在i处显示错误,它是'for'循环的变量,在'var'部分声明.'potencia'是我放在上面的另一个函数,它取代了'power(base,exp)',所以我可以用整数来计算幂.

function potencia(var base,exp: integer):integer;
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Dav*_*nan 5

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

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

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

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

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

function bintoint(n: string):integer;
function potencia(base,exp: integer):integer;
Run Code Online (Sandbox Code Playgroud)

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

function bintoint(const n: string):integer;
function potencia(const base,exp: integer):integer;
Run Code Online (Sandbox Code Playgroud)

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

n := Trim(n);
Run Code Online (Sandbox Code Playgroud)