【问题标题】:Delphi: Types of Actual and Formal Parameters Must Be IdenticalDelphi:实际参数和形式参数的类型必须相同
【发布时间】:2014-10-16 06:23:28
【问题描述】:

这个标题已经有很多问题了;但是,没有一个解决我的问题。我实际上试图通过引用传递,但在尝试编译我的代码时收到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 程序员),“这个百灵鸟从哪里弄到 [] 位?这是我咨询的资源(看看我为什么看cmets 中有错误,如下):consulted resource.

【问题讨论】:

  • 为什么要在调用中的参数周围加上[ 方括号]?你想将它们作为数组传递吗?为什么?当函数名称是UpdateDeviceStatusp 时,你为什么要调用UodateDeviceStatus
  • @JensG 所以,我从您的评论中推断不需要括号?其次,这是我在向 SO 输入代码时的拼写错误。谢谢。
  • 是的。我只是想确认哪些错误只是拼写错误,哪些不是。 ;-)
  • 你用的哪本书告诉你要把参数放在括号里?
  • 我明白了。谢谢你。这些示例使用ShowMessageFmt。你的函数看起来像ShowMessageFmt 的声明吗?注意“通过引用传递数据”部分,查看参数(A)实际通过引用传递的地方。它不在括号内。

标签: delphi pass-by-reference


【解决方案1】:

我猜括号是问题所在。 这段代码对我有用:

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
);

这是完全不同的东西。

【讨论】:

  • 也可能是set
  • 在这种情况下,作为函数调用的参数,方括号只能解释为开放数组构造函数。我认为。参数的类型肯定不能决定传递的表达式的类型。
  • 哈!我错了。 [...] 作为实际的 arg 可以根据上下文设置或数组。当你有一个需要集合和数组的重载时,这很有趣。猜猜哪个配?!! :-(
  • @David,编译器是通灵的和恶意的。匹配的就是你不想要的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多