| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Чему равно? |
| Автор: drkot 26.3.2013, 03:56 | ||
Вопрос: чему равно PageData + PageDataSize - Header ? |
| Автор: Alexeis 26.3.2013, 07:48 |
| Адрес + целое число = смещение адреса. Результат разницы между адресами это целое число равное количеству элементов расположенных между адресами одного массива. В данном случае 1 элемент равен 1му байту. PS Хотя в новых делфях Char 2х байтовый, но мне кажется, что код старый и кроме того используется функция Move которая ожидает байты. |
| Автор: Чучмек 26.3.2013, 09:24 | ||
Раньше для работы с адресами использовал
сейчас все больше использую PChar - запись становится короче. Для совместимости с юникодными delphi необходимо объявлять как PAnsiChar |
| Автор: Alexeis 26.3.2013, 09:36 |
| В новых версиях можно включить режим адресной арифметики {$POINTERMATH ON} и производить вычисления с указателями любого типа. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirspointermath_xml.html |
| Автор: drkot 26.3.2013, 20:20 |
Спасибо, очень полезно. не знал. Код старый еще с семерки. догадывался что это именно так. но XE3 жутко ругался на конструкцию (он на многое ругается) с типизированными указателями (PByte), пришлось привести к PChar. Вот и возник вопрос. На это как раз и ругается. TMyType = PByte. Так если переменные TMyType ругается на несовместимость Спасибо всем |
| Автор: bems 26.3.2013, 20:54 |
тип PByte объявлен в режиме POINTERMATH ON поэтому адресная арифметика для него работает даже там где POINTERMATH OFF если ХЕ3 ругается это значит что или ты что-то напутал, или что в ХЕ3 совсем всё поломали. последний вариант мне кажется очень правдоподобным |
| Автор: Чучмек 26.3.2013, 21:16 |
| В xe3 работает. |
| Автор: Alexeis 26.3.2013, 21:37 | ||
Я думаю что дело как раз в том что
TMyType ведь не объявлен в режиме POINTERMATH ON |
| Автор: Чучмек 26.3.2013, 21:55 |
| Не работает сложение. |
| Автор: bems 26.3.2013, 22:08 |
| в ХЕ2 это ничего не меняет какое именно? |
| Автор: Чучмек 26.3.2013, 22:15 |
бессмысленное - указатель с указателем. |
| Автор: Alexeis 26.3.2013, 22:25 |
| Бессмысленная арифметика и не работает. Работает указатель + число и указатель - указатель. На указатель + указатель работает защита от дурака. |
| Автор: bems 26.3.2013, 22:26 |
аа, ну это да. Так оно и с PChar не работает |
| Автор: northener 27.3.2013, 00:07 |
Вот интересно. А компиляторы Си такое сложение пропускают? Сейчас под руками нет ничего что-бы проверить. |
| Автор: drkot 27.3.2013, 03:47 |
в Си пропускают. думаю что указатели просто трактуются как бес знаковое целое. не знаю как там XE2, но при переносе проектов с XE и младше на XE3 еще не один гладко не прошел. Самое распространенное это NativeInt. На втором месте строки (ну тут понятно). Очень напрягает приведение типов Var параметров. Ассемблерные вставки это отдельная песня... (в x64 это недопустимо). Насколько понимаю тенденция в сторону ужесточения синтаксиса. |
| Автор: bems 27.3.2013, 10:18 |
| я с ХЕ на ХЕ2 перешел оч легко. строки были уже в порядке, потому что переход на уникод был раньше и отдельно асм допустим, только в варианте полностью ассемблерных процедур а что с var-параметрами? Добавлено через 3 минуты и 32 секунды да не, в этом же нет никакого смысла. ну если вдруг какой и пропускает, то меня бы это сильно удивило |
| Автор: Alexeis 27.3.2013, 19:52 | ||||
Не пропускают компиляторы С++, потому что адресная арифметика в делфи стыбжена как раз из языка С . Если очень нужно могу накопать учебник какой или стандарт, но я сам проверял и компилятор ругался, причем ругался не ворнингом а ерором. Единственный вариант просуммировать указатели это привести один из указателей к целому числу. Вот выдержка из стандарта языка С99 о допустимых операндах в арифметических выражениях
Дальше идет уточнение по этим пунктам. Операция сложения указателей не определена стандартом. |