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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Vano
Сообщения: 41
Зарегистрирован: 16 авг 2004, 22:21
Откуда: Днепропетровск
Контактная информация:

Примерно так я написал:

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

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


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

Vano, на сколько я помню, для нетипизированного указателя не определён размер. Поэтому +5 просто бессмысленно.
А для PChar всё понятно: +5 означает сдвинуться вперёд на 5 байтов.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Да, по идее должно прокатить что-то вроде слудующего:
Buf2:=PChar(Buf1)+5; Ну это если ты на 5 байтов сдвинутся желаешь.
Даже самый дурацкий замысел можно воплотить мастерски
Vano
Сообщения: 41
Зарегистрирован: 16 авг 2004, 22:21
Откуда: Днепропетровск
Контактная информация:

Да я уже сделал. Почти так же как ты написал :) . Всё равно СПАСИБО!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

:) AiK, тут с точки зрения семантики кода вместо приведения к PChar логичнее делать приведение к типу Integer. Указатель-то нетипизированный...

Inc(Integer(Buf),5); или :=Integer(Buf)+5
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Если я ничего не путаю, Inc(Integer(Buf),5); означает смещение на 20 байтов.
Т.е. если это именно то, что нужно, то почему бы и так не сделать? :)
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Ан нет!
:)
Первый аргумент имеет тип Integer, стало быть тут чистая арифметика!
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

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

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

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...
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

В Integer, в Integer.
Integer платформозависимый и для Win32 эквивалентен LongInt.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

А что за фигня Integer(P)? Ведь в P хранится отнюдь не Integer
Какая разница, чего там хранится. Это адрес? адрес.
2B OR NOT(2B) = FF
Ответить