德尔福:实际和形式参数的类型必须相同

时间:2014-10-15 18:48:31

标签: delphi pass-by-reference

这个标题已经有很多问题了;但是,没有人解决我的问题。我实际尝试通过引用传递,但在尝试编译我的代码时收到E2033: Types of actual and formal var parameters must be indentical错误。我试图传递三(3)个变量,每个变量是Integer,两个是引用(Var)而另一个不是。

我不明白我的代码的问题,如下所示。我已经包含了声明,定义和调用。

常规声明:

private
    updateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices: Integer);

我试图不压缩参数的声明,并在前两个声明Var,明确地'但是,这不起作用。

问题1:是错误,因为我通过引用和值混合(如果我记得,正确的话,某些语言不允许这样做)?

常规的定义:

procedure TfrmReturnMeterToMfg.UpdateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices : Integer);
begin
    // DO SOMETHING
end;

实际上,例程正文中的代码对于问题是微不足道的,并且不会影响问题(至少在这种情况下它不应该是原因)。

常规召唤:

以下内容包含在另一个例程的正文中:

// local variables:
var ReturnCount, NotFoundCount, NumOfDevices: Integer;
begin

// SOMETHING HAPPENS TO EACH OF THESE VALUES (THEY ARE INCREMENTED)

UpdateDeviceStatus([ReturnCount], [NotFoundCount], NumOfDevices);
end;

然后我收到错误。

问题2 :这是我在调用例程时尝试传递参数的语法结果吗?

编辑

所以,你可能想知道(你是​​一个更有经验的Delphi程序员),"这个百灵鸟在哪里拿到了[]位?这是我正在咨询的资源(看看为什么我在下面的评论中看错了):consulted resource

1 个答案:

答案 0 :(得分:4)

我猜括号是问题所在。 这段代码适合我:

program Project12;

{$APPTYPE CONSOLE}

type
 TfrmReturnMeterToMfg = class
 private
   procedure UpdateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices : Integer);
 end;


procedure TfrmReturnMeterToMfg.UpdateDeviceStatus(Var aReturnCount, aNotFoundCount: Integer; aNumOfDevices : Integer);
begin
    // DO SOMETHING
end;

var thing : TfrmReturnMeterToMfg;
    ReturnCount, NotFoundCount, NumOfDevices: Integer;
begin
  ReturnCount := 4;
  NotFoundCount := 2;
  NumOfDevices := 42;

  thing := TfrmReturnMeterToMfg.Create;
  thing.UpdateDeviceStatus( ReturnCount, NotFoundCount, NumOfDevices);
  thing.Free;
end.

在参数周围添加括号会完全改变代码的含义,它们意味着什么。在这种特殊情况下,通过添加括号,您可以指示编译器传递

UpdateDeviceStatus( 
  [ ReturnCount ],      // array or set of integer (with one element)
  [ NotFoundCount ],    // same again here
  NumOfDevices          // integer
);

这是完全不同的东西。