Integer () в 64-битном XE2 - PullRequest
       37

Integer () в 64-битном XE2

3 голосов
/ 08 октября 2011

Как это будет правильно, если на 64-битной платформе в XE2?

type
  PRGB24 = ^TRGB24;
  TRGB24 = packed record
    B: Byte;
    G: Byte;
    R: Byte;
  end;

var
  s1: pRGB24;
  ptrD: integer;

....

inc(Integer(s1), PtrD); <- gives error here "Left side cannot be assigned to"

Ответы [ 2 ]

5 голосов
/ 08 октября 2011

Пока NativeInt выполнит работу, я бы предпочел привести ее к PByte:

inc(PByte(s1), PtrD);

Так как s1 является указателем, приведение к другому указателю более естественно - не может быть ошибки ширины указателя ни сейчас, ни в будущем.

5 голосов
/ 08 октября 2011

Целочисленный тип имеет 32-битную длину, тип указателя - 64-битную длину на 64-битной платформе, следовательно, ошибка.Я не могу проверить это сейчас, но

inc(NativeInt(s1), PtrD);

должен решить проблему.


Кстати: Inc процедура может принимать указатели, поэтому обычно нет необходимости приводитьуказатель на целое число здесь.Тот же самый результат может быть получен с помощью

inc(PByte(s1), PtrD);

. Чтобы избежать s1, кастинг вообще даже лучше

inc(s1, PtrD);

, но это меняет смысл кода - его эквивалент равен

inc(PByte(s1), PtrD * SizeOf(TRGB24 ));
...