В 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
.
Суть в том, что, хотя мы можем объяснить, почему компилятор жалуется на ваш код, мы не можем дать вам окончательного решения.
Почему PByte, а не PBoolean? –
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