2010-11-12 3 views
4

Я унаследовал приложение Delphi, и я ничего не знаю об объекте pascal.Ошибка компилятора Delphi E2064 левая сторона не может быть назначена

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

Нельзя назначить левую сторону E2064.

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

Но, судя по всему, вы можете преодолеть это поведение; по существу превращая константы в vars, перейдя в опции Build под компилятором Delphi и включив «Assignable Typed constants».

Я сделал это, и я продолжаю получать ту же ошибку.

Я попытался окружить свой код {$ 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, я получаю ошибку, которая отличается от предыдущей декларации, но я понятия не имею, где предыдущая декларация ...

+0

Задача @jachguate - XE, поэтому она выглядит как проблема Unicode. –

+0

Я не осознал свою 38-процентную ставку. Спасибо, что указали это, я посмотрю, смогу ли я это исправить. Это пакет, который я не писал (сторонняя сторона от IOCOMP.com). И это сторонний набор элементов управления VCL, используемых в C++ Builder 6. Я пытаюсь просто скомпилировать CBuilder XE, поскольку пока у них еще нет версии XE их инструментов. – Eric

ответ

8

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

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

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

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

+0

Это довольно плохой код. Я собираюсь угадать, что компилятор используется для терпимости при произнесении в левой части равенства, но больше не работает. Мне никогда не приходило в голову, что это будет терпимо - как программист, я бы этого не допустил. Я знаю, что они закрыли еще несколько случаев, которые не собирались компилировать, но, возможно, это другое. –

+0

Компилятор должен по-прежнему терпеть левые роли, @Loren. Иногда это может быть полезно, например, когда вы хотите присвоить значение переменной интерфейса без запуска подсчета ссылок - просто введите тип - «Указатель». Проблема здесь в том, что с Delphi 2009 размеры разные. –

+0

Напомним: (1) плохой код? Я не писал (2) Я не знаю объект pascal, что так всегда (3) это сторонний vcl-контроль от IOCOMP, который, по-видимому, еще не поддерживает BuilderXE, и я просто пытаюсь скомпилировать пакет времени разработки против временные изображения под BuilderXE и не зная, что pascal представляет мне вызов. Спасибо за ответ. – Eric

1

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

+0

Не уверен - вы, вероятно, правы. Это инструменты VCL IOCOMP, которые мы используем (http://www.iocomp.com/). – Eric

+0

Можете ли вы рассказать о том, как исправить это? Я не могу найти, где pngimage входит в чем-либо с помощью HPP файлов Grep pngimage * iComponentEditorImageEditorPanel.hpp #include // Паскаль блок Iocomp65.tds: Grep: входные линии усеченного - результат сомнительных iVCLComponent.hpp #include // Блок Pascal pngimage.hpp // (НЕ ИЗМЕНИТЬ: сгенерированный машиной заголовок) 'pngimage.pas' rev: 22.00 PNGImage.pas шт. pngimage; pngzlib.pas {Это устройство связывает ZLIB с блоком pngimage для реализации} – Eric

+0

@ Eric M: Извините, я ничего не знаю о том, как пакеты и ссылки на файлы .pas обрабатываются на стороне C++ Builder , Может быть, вы могли бы задать это как новый вопрос? –

1

Причина в том, что с 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; 

- jeroen

+0

Это выглядит многообещающе. Я изменил много pChar на pAnsiChar, но я не изменил аргументы функции. Я попробую это и отчитаю. – Eric