Чему равно?

 
0
 
Delphi, Kylix and Pascal
ava
drkot | 26.03.2013, 04:56

var
  PageData: PChar;   
  PageDataSize: Integer; 
  Header: PChar;
....
    Move(S, D, PageData + PageDataSize - Header);



Вопрос: чему равно PageData + PageDataSize - Header ?
Ответы (17)
ava
Alexeis | 26.03.2013, 07:48 #
  Адрес + целое число = смещение адреса. Результат разницы между адресами это целое число равное количеству элементов расположенных между адресами одного массива. В данном случае 1 элемент равен 1му байту.

PS Хотя в новых делфях Char 2х байтовый, но мне кажется, что код старый и кроме используется функция Move которая ожидает байты.
ava
Чучмек | 26.03.2013, 09:24 #
Раньше для работы с адресами использовал

Cardinal(PointerVar)

сейчас все больше использую PChar - запись становится короче.
Для совместимости с юникодными delphi необходимо объявлять как PAnsiChar
ava
Alexeis | 26.03.2013, 09:36 #
  В новых версиях можно включить режим адресной арифметики {$POINTERMATH ON} и производить вычисления с указателями любого типа.
http://docs.embarcadero.com/products/rad_s...ermath_xml.html
ava
bems | 26.03.2013, 15:42 #
Цитата (Alexeis @  26.3.2013,  09:36 findReferencedText)
В новых версиях можно включить режим адресной арифметики {$POINTERMATH ON} и производить вычисления с указателями любого типа

а с PByte даже включать не нужно
ava
drkot | 26.03.2013, 20:20 #
Цитата (Alexeis @  26.3.2013,  09:36 findReferencedText)
В новых версиях можно включить режим адресной арифметики 

Спасибо, очень полезно. не знал.
Код старый еще с семерки.


Цитата (Alexeis @  26.3.2013,  07:48 findReferencedText)
Адрес + целое число = смещение адреса. 

догадывался что это именно так. но XE3 жутко ругался на конструкцию (он на многое ругается) с типизированными указателями (PByte), пришлось привести к PChar.
Вот и возник вопрос.

Цитата (bems @  26.3.2013,  15:42 findReferencedText)
а с PByte даже включать не нужно

На это как раз и ругается. TMyType = PByte. Так если переменные TMyType ругается на несовместимость

Спасибо всем
ava
bems | 26.03.2013, 20:54 #
Цитата (drkot @  26.3.2013,  20:20 findReferencedText)
На это как раз и ругается

тип PByte объявлен в режиме POINTERMATH ON поэтому адресная арифметика для него работает даже там где POINTERMATH OFF
если ХЕ3 ругается это значит что или ты что-то напутал, или что в ХЕ3 совсем всё поломали. последний вариант мне кажется очень правдоподобным
ava
Чучмек | 26.03.2013, 21:16 #
В xe3 работает.
ava
Alexeis | 26.03.2013, 21:37 #
Я думаю что дело как раз в том что
Цитата (drkot @  26.3.2013,  21:20 findReferencedText)
TMyType = PByte. Так если переменные TMyType ругается на несовместимость


TMyType ведь не объявлен в режиме POINTERMATH ON 
ava
Чучмек | 26.03.2013, 21:55 #
Не работает сложение.
ava
bems | 26.03.2013, 22:08 #
Цитата (Alexeis @  26.3.2013,  21:37 findReferencedText)
TMyType ведь не объявлен в режиме POINTERMATH ON 

в ХЕ2 это ничего не меняет


Цитата (Чучмек @  26.3.2013,  21:55 findReferencedText)
Не работает сложение. 

какое именно?
ava
Чучмек | 26.03.2013, 22:15 #
Цитата (bems @  26.3.2013,  22:08 findReferencedText)
какое именно? 

бессмысленное - указатель с указателем.
ava
Alexeis | 26.03.2013, 22:25 #
  Бессмысленная арифметика и не работает. Работает указатель + число и указатель - указатель. На указатель + указатель работает защита от дурака.
ava
bems | 26.03.2013, 22:26 #
Цитата (Чучмек @  26.3.2013,  22:15 findReferencedText)
бессмысленное - указатель с указателем. 

аа, ну это да. Так оно и с PChar не работает smile
ava
northener | 27.03.2013, 00:07 #
Цитата (bems @  26.3.2013,  22:26 findReferencedText)
аа, ну это да. Так оно и с PChar не работает

Вот интересно. А компиляторы Си такое сложение пропускают?
Сейчас под руками нет ничего что-бы проверить.
ava
drkot | 27.03.2013, 03:47 #
Цитата (northener @  27.3.2013,  00:07 findReferencedText)
 А компиляторы Си такое сложение пропускают?

в Си пропускают.
думаю что указатели просто трактуются как бес знаковое целое.

Цитата (bems @  26.3.2013,  20:54 findReferencedText)
или что в ХЕ3 совсем всё поломали

не знаю как там XE2, но при переносе проектов с XE и младше на XE3 еще не один гладко не прошел.
Самое распространенное это NativeInt. На втором месте строки (ну тут понятно).
Очень напрягает приведение типов Var параметров.
Ассемблерные вставки это отдельная песня... (в x64 это недопустимо).

Насколько понимаю тенденция в сторону ужесточения синтаксиса.
ava
bems | 27.03.2013, 10:18 #
я с ХЕ на ХЕ2 перешел оч легко. строки были уже в порядке, потому что переход на уникод был раньше и отдельно
асм допустим, только в варианте полностью ассемблерных процедур

а что с var-параметрами?
ava
Alexeis | 27.03.2013, 19:52 #
Цитата (bems @  27.3.2013,  11:18 findReferencedText)
да не, в этом же нет никакого смысла.

ну если вдруг какой и пропускает, то меня бы это сильно удивило 

  Не пропускают компиляторы С++, потому что адресная арифметика в делфи стыбжена как раз из языка С . Если очень нужно могу накопать учебник какой или стандарт, но я сам проверял и компилятор ругался, причем ругался не ворнингом а ерором. Единственный вариант просуммировать указатели это привести один из указателей к целому числу. 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить