Ошибка компилятора Delphi E2064 левой стороне не может быть назначена - PullRequest
4 голосов
/ 12 ноября 2010

Я унаследовал приложение Delphi и ничего не знаю об объекте pascal.

Это BPL, который мне нужно скомпилировать в новую версию C ++ Builder XE .
Когда язапустив make я получаю сообщение об ошибке:

E2064 не может быть назначена левая сторона.

Я выучил достаточно obj pascal, чтобы знать, что у меня есть константа, которая пытается присвоить значение.

Но, по-видимому, вы можете переждать этот беанвиор;по сути, превращая константы в переменные, перейдя в параметры сборки в компиляторе Delphi и включив «Назначаемые типизированные константы».

Я сделал это и продолжаю получать ту же ошибку.мой код с {$ J +} и {$ J-}, и все равно он не скомпилируется.

procedure TChunkIDAT.CopyInterlacedRGB8(const Pass: Byte;
  Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar );
var
  Col: Integer;
 begin
 {Get first column and enter in loop}
 Col := ColumnStart[Pass];
 Dest := pChar(Longint(Dest) + Col * 3);
 repeat
 {Copy this row}

  Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);

Получите ошибку в последней строке.Если я изменяю const на var, я получаю ошибку, что объявление отличается от предыдущего объявления, но я понятия не имею, где находится предыдущее объявление ....

Ответы [ 3 ]

8 голосов
/ 12 ноября 2010

Вы вводите двухбайтовую вещь (Char) в однобайтовую вещь (Byte). Чтение этого значения легко определить, но сделать это значение доступным для записи сложно, вероятно, по той же причине типы формальных и фактических параметров "var" должны быть идентичны.*

Возможно, вы хотели привести его к типу двухбайтовых символов, например Word.Или, может быть, вы хотите, чтобы GammaTable был массивом Char, поэтому вам вообще не нужно приводить тип.Или, может быть, если этот код был изначально написан для версии Delphi ранее 2009 года, вы хотите, чтобы эти PChar объявления были PAnsiChar - типы символов стали шире.Другим вариантом является приведение типа Dest к PByte и , затем разыменовывает результат.Это, вероятно, плохая идея, поскольку вы будете перезаписывать только каждый второй байт буфера.

Исходя из названия функции, кажется, что PChar никогда не был подходящим типом данных для использования.,Этот тип предназначен для символов данных, но я думаю, что этот код имеет дело с байтами .Правильнее всего сделать это, вероятно, изменить PChar на PByte, и тогда вам вообще не нужно набирать Dest.

Директива $J не имеет значения;он контролирует, позволит ли компилятор присваивать значения типизированным константам.У вас нет ни одного из них в этом коде.

1 голос
/ 12 ноября 2010

Причина в том, что в Delphi 2009 Char, PChar и String являются Unicode и хранят более одного байта на символ.
Вы не должны приводить эти указатели к байтам, и компилятор не позволяет назначать их, если вы приводите левую сторону назначения к байту.

Это компилируется:

procedure CopyInterlacedRGB8(const Pass: Byte; Dest: pAnsiChar); overload;
begin
  Byte(Dest^) := Pass;
end;

Это не:

procedure CopyInterlacedRGB8(const Pass: Byte; Dest: pChar); overload;
begin
  Byte(Dest^) := Pass;
end;

Вместо pChar вы должны использовать pByte, что упрощает код:

procedure CopyInterlacedRGB8(const Pass: Byte; Dest: PByte); overload;
begin
  Dest^ := Pass;
end;

- Йерун

1 голос
/ 12 ноября 2010

Похоже, вы работаете с библиотекой Густаво Дауда TPngImage. Вам не нужен этот код во внешнем BPL, потому что он был включен в RTL с D2009. Удалите этот блок из BPL, и вы сможете получить обновленную версию через блок PngImage.

...