【问题标题】:Delphi - E2010 Incompatible types: 'Integer' and 'Char' - Any ideasDelphi - E2010 不兼容的类型:'Integer' 和 'Char' - 任何想法
【发布时间】:2012-04-26 01:47:42
【问题描述】:

我的任务是将旧版 Delphi 应用程序移植到 C# .Net。最初的 delphi 开发人员在我被录用前几个月就离开了。我收到了:

E2010 不兼容的类型:“Integer”和“Char”错误

对于下面的方法。我正在尝试在 Delphi 2007 IDE 中编译应用程序,我被告知原始应用程序是 Delphi 4 或 5,如果有帮助的话。我明白错误告诉我什么,但我不明白为什么\如何将它应用于下面的代码 sn-p。任何帮助\方向将不胜感激。

在此先感谢 - 不确定我是否在代码上完成了它。

上层定义:

Upper: array[1..256] of Char =
(#$00,#$01,#$02,#$03,#$04,#$05,#$06,#$07,#$08,#$09,#$0A,#$0B,#$0C,#$0D,#$0E,#$0F,
 #$10,#$11,#$12,#$13,#$14,#$15,#$16,#$17,#$18,#$19,#$1A,#$1B,#$1C,#$1D,#$1E,#$1F,
 #$20,#$21,#$22,#$23,#$24,#$25,#$26,#$27,#$28,#$29,#$2A,#$2B,#$2C,#$2D,#$2E,#$2F,
 #$30,#$31,#$32,#$33,#$34,#$35,#$36,#$37,#$38,#$39,#$3A,#$3B,#$3C,#$3D,#$3E,#$3F,
 #$40,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,
 #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$5B,#$5C,#$5D,#$5E,#$5F,
 #$60,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,
 #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$7B,#$7C,#$7D,#$7E,#$7F,
 #$80,#$81,#$82,#$83,#$84,#$85,#$86,#$87,#$88,#$89,#$8A,#$8B,#$8C,#$8D,#$8E,#$8F,
 #$90,#$91,#$92,#$93,#$94,#$95,#$96,#$97,#$98,#$99,#$9A,#$9B,#$9C,#$9D,#$9E,#$9F,
 #$A0,#$A1,#$A2,#$A3,#$A4,#$A5,#$A6,#$A7,#$A8,#$A9,#$AA,#$AB,#$AC,#$AD,#$AE,#$AF,
 #$B0,#$B1,#$B2,#$B3,#$B4,#$B5,#$B6,#$B7,#$B8,#$B9,#$BA,#$BB,#$BC,#$BD,#$BE,#$BF,
 #$C0,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$CA,#$CB,#$CC,#$CD,#$CE,#$CF,
 #$D0,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,#$D7,#$D8,#$D9,#$DA,#$DB,#$DC,#$DD,#$DE,#$DF,
 #$E0,#$E1,#$E2,#$E3,#$E4,#$E5,#$E6,#$E7,#$E8,#$E9,#$EA,#$EB,#$EC,#$ED,#$EE,#$EF,
 #$F0,#$F1,#$F2,#$F3,#$F4,#$F5,#$F6,#$F7,#$F8,#$F9,#$FA,#$FB,#$FC,#$FD,#$FE,#$FF);

function StrIComp_JOH_PAS_1(const Str1, Str2: PChar): Integer;
var
  Ch1, Ch2 : Char;
  Offset   : Integer;
  PStr     : PChar;
begin;
  PStr   := Str1;
  Offset := Str2 - PStr;
  repeat
    Ch1 := Upper[PStr^];
    Ch2 := Upper[PStr[Offset]];
    if (Ch1 = #0) or (Ch1 <> Ch2) then
      Break;
     Inc(PStr);
  until False;
  Result := Integer(Ch1) - Integer(Ch2);
end;

【问题讨论】:

    标签: delphi delphi-2007


    【解决方案1】:

    您的代码对Upper 常量进行了不正确的修改。应该是:

    Upper: array[Char] of Char = ....
    

    当然,更好的办法是简单地将这个例程扔掉,并在SysUtils 单元中使用Delphi 附带的StrIComp 版本。当简单地删除代码会导致程序正确时,解决这个问题似乎没有什么意义。


    由于您要将其移植到 C#,您可以简单地使用 String.Compare 并将 true 传递给 ignoreCase 参数。

    感谢 @Ulrich 认识到这段代码源自 FastCode 项目。

    【讨论】:

    • +1 我认为“Upper”被定义为“Upper: array[Char] of Char;”每个字符都将被“大写”
    • @dorin 因为其他所有内容都可以编译,所以编译器错误必须存在,这是我可以想象出现编译器错误的唯一方法
    • @zeencat 感谢包含Upper 定义的编辑。事实证明我的猜测是错误的。而不是array [char] of Integer,而是array [Integer] of char。无论如何,我更新的答案将使您的程序编译。
    • 从它的名字猜测这个例程似乎来自FastCode StrIComp challenge
    • @zeencat 好吧,[1..MaxInt] 也是错误的。它应该是array [char] of char。但只需删除此例程即可。真的,直接删了吧。然后编译器将使用 SysUtils 中同名的函数。
    【解决方案2】:

    你的 pascal 模块中有 const Upper 定义吗? 如果没有,请从here获取它

    【讨论】:

    • 另外,我认为 Char 和 PChar 必须使用较新版本的 Delphi (D2009+) 更改为 AnsiChar 和 PAnsiChar
    • @J... zeencat 似乎在使用 ANSI Delphi, 2007
    • @DavidHeffernan 是的,我错过了。我一定是被 OP 的 sn-p 的创造力瞬间惊呆了。
    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多