编译错误:[dcc32错误] E2064左侧无法分配

时间:2016-07-11 03:31:02

标签: delphi unicode inno-setup delphi-10.1-berlin

我是Delphi的新手,并尝试使用Inno Setup的源代码和Delphi 10.1柏林编译Inno Setup的Setup.e32文件。

但问题是当我尝试编译时,我不断收到错误[dcc32 Error] uPSUtils.pas(944): E2064 Left side cannot be assigned to.

我不知道如何解决这个问题并且还在本网站上阅读了有关该错误的问题,但甚至无法确定此代码中的错误。

代码的各个部分:

function FastUpperCase(const s: String): string;
{Fast uppercase}
var
  I: Integer;
  C: Char;
begin
  Result := S;
  I := Length(Result);
  while I > 0 do
  begin
    C := Result[I];
    if c in [#97..#122] then
      Dec (Byte(Result[I]), 32);  <<<Error E2064 HERE>>>
    Dec(I);
  end;
end;

function FastLowerCase(const s: String): string;
{Fast lowercase}
var
  I: Integer;
  C: Char;
begin
  Result := S;
  I := Length(Result);
  while I > 0 do
  begin
    C := Result[I];
    if C in [#65..#90] then
      Inc(Byte(Result[I]), 32);  <<<ERROR E2064 HERE>>>
    Dec(I);
  end;
end;

 function ParseToken(var CurrTokenPos, CurrTokenLen: Cardinal; var  CurrTokenId: TPSPasToken): TPSParserErrorKind;
  {Parse the token}
  var
    ct, ci: Cardinal;
    hs: Boolean;
    p: PChar;
  begin
    ParseToken := iNoError;
    ct := CurrTokenPos;
     case FText[ct] of
      #0:
         begin
          CurrTokenId := CSTI_EOF;
          CurrTokenLen := 0;
         end;
      'A'..'Z', 'a'..'z', '_':
         begin
           ci := ct + 1;
          while (FText[ci] in ['_', '0'..'9', 'a'..'z', 'A'..'Z']) do begin
            Inc(ci);
            end;
              CurrTokenLen := ci - ct;

           FLastUpToken := GetToken(CurrTokenPos, CurrtokenLen);
          p := pchar(FLastUpToken);
           while p^<>#0 do
          begin
            if p^ in [#97..#122] then
              Dec ((Byte(p^)), 32);  <<<ERROR E2064 HERE>>>
            inc(p);
          end;
          if not CheckReserved(FLastUpToken, CurrTokenId) then
          begin
            CurrTokenId := CSTI_Identifier;
          end;
        end;

这些代码有什么问题?

我创建compilesettings.bat并点击compile.bat以编译非Unicode Inno设置(现在我安装了Delphi 7 .............),这就是发生了。

This is what happened after following instructions...........

2 个答案:

答案 0 :(得分:3)

此代码是为Unicode前版本的Delphi编写的,其中Char是8位AnsiChar的别名。演员Byte反映了这一点。由于Delphi 2009 Char别名为16位WideChar

假设您正在编译正确的代码(您不是 - 见下文),解决方案是使用预期的编译器编译此代码。要确定这是什么,请阅读文档:https://github.com/jrsoftware/issrc/blob/master/README.md。我对此的解读是,您应该能够使用Delphi 7或Delphi 2007编译Inno的非Unicode版本。

当然,编译Unicode版本可能更容易。在自述文件中再次详细说明了这样做的说明。

从评论中可以看出,您没有编译PascalScript源的预期版本。你说你下载了一些名称相同的文件。不要这样做。使用从Inno存储库链接的源。使用那里推荐的编译器。既然你有Delphi 10.1柏林编译Unicode Inno。

看起来你因为源文件混乱而陷入困境。如果我是你,我会从Inno存储库中重新下载。

  1. 删除现有的文件混搭。
  2. 从Inno存储库中获取最新的源代码。
  3. 按照自述文件中的说明编译Inno的Unicode版本。

答案 1 :(得分:2)

自述文件明确指出有Inno的Unicode版本:

  
      
  • 安装Borland Delphi

         

    Unicode Inno设置

         

    我们使用Update 3 编译Delphi 2009下的所有Inno Setup项目。

         

    较新的Delphi版本也应该可以,但会导致更大的文件。

         

    要在Windows 8.1下使用Delphi 2009 IDE,您需要这两件事才能使其正常运行:

         

    http://www.jrsoftware.org/files/Delphi_2007_2009_WOW64_Debugger_Fix.exe(md5sum:545fc506c0614cf7a3339a7acb5217dc)

         

    http://www.jrsoftware.org/files/dzEditorLineEndsFix.exe(md5sum:c9598cf14452dd08987c5aec23d04f7d)

         

    ...

  •   
  • 建筑

         

    要构建所有文件,请运行build.bat并按照说明进行操作。

         

    只编译Inno Setup运行compile-unicode.bat进行Unicode Inno Setup 或compile.bat进行Non Unicode Inno Setup并按照说明操作。

         

    ...

  •   

使用Delphi 2009或更高版本(包括10.1 Berlin)时,请确保您正在编译Inno的 Unicode 版本,而不是 Ansi 版本。

话虽这么说,可以重新编写麻烦的代码行以与Unicode版本的Delphi兼容:

if c in [#97..#122] then
  Result[I] := Char(Ord(c) - 32);
  // or: Dec(c, 32); Result[I] := c;

if C in [#65..#90] then
  Result[I] := Char(Ord(c) + 32);
  // or: Inc(c, 32); Result[I] := c;

if p^ in [#97..#122] then
  Dec(p^, 32);

但是,如果您使用正确的启用Unicode的代码版本,则不需要这样做。