Delphi в мире Юникода


         

Использование преобразований к PChar() для работы с указателями при указании на не символьные типы


В предыдущих версиях не все типизированные указатели поддерживали арифметические операции. Из-за этого для выполнения арифметических операций над такими указателями они преобразовывались к PChar. В Delphi 2009 арифметика для указателей может быть включена директивой компилятора и она специально включена для типа PByte. Таким образом, если у Вас есть подобный код, преобразующий указатель к PChar для выполнения арифметических операций над ним:  function TCustomVirtualStringTree.InternalData(Node: PVirtualNode): Pointer;  begin    if (Node = FRoot) or (Node = nil) then      Result := nil    else      Result := PChar(Node) + FInternalDataOffset;  end; Вы должны заменить его использованием PByte вместо PChar:  function TCustomVirtualStringTree.InternalData(Node: PVirtualNode): Pointer;  begin    if (Node = FRoot) or (Node = nil) then      Result := nil    else      Result := PByte(Node) + FInternalDataOffset;  end;

В приведенном выше куске кода Node не содержит символьных данных. Он преобразовывается к PChar только для доступа к данным, расположенным через заданное число байт после Node. Раньше это работало, так как SizeOf(Char) = SizeOf(Byte). Теперь это работать не будет. Чтобы сделать работу кода правильной, следует использовать PByte вместо PChar. Если оставить все без изменений, Result будет указывать на некорректные данные.



Содержание раздела