Страница 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
Какая разница, чего там хранится. Это адрес? адрес.