Страница 1 из 2

Как сделать смещение указателя типа Pointer?

Добавлено: 04 ноя 2004, 19:21
Vano
Примерно так я написал:

Код: Выделить всё

var buf1,buf2:Pointer;
      len:integer;
      F:TFileStream;


......................
GetMem(buf, len);
Socket.ReciveBuf(buf^,len);
Buf2:=Buf1+5;                 //Здесь выскакивает ошибка
F.Write(Buf2,len);.......................
Как я не пытался задать смещение указателю типа Pointer все время выскакивает ошибка. Хотя тоже проделывал с PChar всё нормально работает. Почему так??

Добавлено: 04 ноя 2004, 19:25
AiK
Vano, на сколько я помню, для нетипизированного указателя не определён размер. Поэтому +5 просто бессмысленно.
А для PChar всё понятно: +5 означает сдвинуться вперёд на 5 байтов.

Добавлено: 04 ноя 2004, 19:26
AiK
Да, по идее должно прокатить что-то вроде слудующего:
Buf2:=PChar(Buf1)+5; Ну это если ты на 5 байтов сдвинутся желаешь.

Добавлено: 04 ноя 2004, 20:02
Vano
Да я уже сделал. Почти так же как ты написал :) . Всё равно СПАСИБО!

Добавлено: 09 ноя 2004, 08:32
Naeel Maqsudov
:) AiK, тут с точки зрения семантики кода вместо приведения к PChar логичнее делать приведение к типу Integer. Указатель-то нетипизированный...

Inc(Integer(Buf),5); или :=Integer(Buf)+5

Добавлено: 09 ноя 2004, 14:56
AiK
Если я ничего не путаю, Inc(Integer(Buf),5); означает смещение на 20 байтов.
Т.е. если это именно то, что нужно, то почему бы и так не сделать? :)

Добавлено: 12 ноя 2004, 00:27
Naeel Maqsudov
Ан нет!
:)
Первый аргумент имеет тип Integer, стало быть тут чистая арифметика!

Добавлено: 12 ноя 2004, 03:13
AiK
Действительно.
Правда, что происходит в этом примере как-то не очень мне понятно:

Код: Выделить всё

var P: Pointer;
begin
  P:=PChar('1234567890ABCDEFGHIJKLMN');
  Inc(Integer(P),2);
  ShowMessage(PChar(P));
end;
Я подразумевал Inc(pInteger(P),2); Здесь всё понятно - указатель сдвинули на 8 байтов, т.к. указатель на Integer имеет размер 4 байта. А что за фигня Integer(P)? Ведь в P хранится отнюдь не Integer...

Добавлено: 12 ноя 2004, 08:15
Naeel Maqsudov
В Integer, в Integer.
Integer платформозависимый и для Win32 эквивалентен LongInt.

Добавлено: 12 ноя 2004, 13:41
Absurd
А что за фигня Integer(P)? Ведь в P хранится отнюдь не Integer
Какая разница, чего там хранится. Это адрес? адрес.