2014-10-07 1 views
1

Я конвертирую старый код из Delphi 5 в XE5. имеет этот кусок кода:Невозможно назначить левую сторону - Boolean (RecBuf [0]): = false

Boolean(RecBuf[0]) := False; 

RecBuf является PChar. Это работает в Delphi 7, но не в XE5. В XE5 он дает ошибку «Левая сторона не может назначить». Как реализовать этот код в XE5?

ответ

12

В Delphi 7, PChar является псевдонимом для PAnsiChar. То есть указатель на 8-битный символ ANSI. Это означает, что RecBuf[0] имеет тип AnsiChar. Поскольку AnsiChar и Boolean имеют одинаковый размер, актер действует.

В Delphi XE5, PChar является псевдонимом для PWideChar, указатель на символ шириной 16 бит. И поэтому RecBuf[0] имеет тип WideChar. Таким образом, приведение недействительно, потому что WideChar и Boolean имеют разный размер.

Точно, как лучше всего устранить проблему, невозможно определить из кода, который вы здесь показали. Вполне возможно, вам нужно обновить код RecBuf. Возможно, он должен быть объявлен как PAnsiChar. Хотя вы действительно задаетесь вопросом, почему вы бросаете персонажа в Boolean.

Другая возможность заключается в том, что причина RecBuf объявлен PChar, чтобы позволить вам использовать оператор индексации [], то, что в более ранних версиях Delphi является специальная способность указателей типов символов. В современной Delphi вы можете использовать {$POINTERMATH ON}, чтобы включить эту функциональность для всех введенных указателей. Итак, если вы это сделали, то, возможно, RecBuf должно быть PBoolean.

Суть в том, что, хотя мы можем объяснить, почему компилятор жалуется на ваш код, мы не можем дать вам окончательного решения.

0

Судя по имени RecBuf, они используются не как указатель на строку, а как указатель на буфер, выделенный в памяти.

Если мое предположение верно, вы можете захотеть повторно использовать RecBuf как переменную типа PByte.

+1

Почему PByte, а не PBoolean? –

+0

PChar часто используется для определения буфера только потому, что он поддерживает арифметику указателя, тогда как другие типы указателей в версии Delphi <2009 нет. После смены PChar из PAnsiChar на руководство PWideChar delphi вместо этого используйте PByte: http: //docwiki.embarcadero.com/RADStudio/XE6/ru/Enabling_Applications_for_Unicode # Use_of_PChar_Casts_to_Enable_Pointer_Arithmetic Если RecBuf всегда указывает на записи с одинаковой структурой, может оказаться целесообразным определить тип записи и объявить RecBuf как указатель на тип записи. – user882813

0

Вы не можете назначать предметы броска слева, вам нужно отбросить правую сторону.

Вместо

Newtype(Whatever) := NewtypeConstant; 

вы должны использовать

Whatever := TUnknown(constant) 

В yourcase, из recbuf представляет собой массив, скажем, байт, то он помещает ложь (0) в ней, поэтому она должна быть

Recbuf[0] := Byte(False); 

Или вы могли бы, знаете ли, просто положить туда нуль.

+2

Не так. Вы можете указать значение левой руки для задания. Вы не можете игнорировать разницу символов Ansi/Wide. –

Смежные вопросы