Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чему равно? PChar + Integer - PChar 
V
    Опции темы
drkot
Дата 26.3.2013, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Код

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



Вопрос: чему равно PageData + PageDataSize - Header ?



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Alexeis
Дата 26.3.2013, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Адрес + целое число = смещение адреса. Результат разницы между адресами это целое число равное количеству элементов расположенных между адресами одного массива. В данном случае 1 элемент равен 1му байту. 

PS Хотя в новых делфях Char 2х байтовый, но мне кажется, что код старый и кроме того используется функция Move которая ожидает байты.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Чучмек
Дата 26.3.2013, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Раньше для работы с адресами использовал
Код

Cardinal(PointerVar)

сейчас все больше использую PChar - запись становится короче.
Для совместимости с юникодными delphi необходимо объявлять как PAnsiChar


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Alexeis
Дата 26.3.2013, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  В новых версиях можно включить режим адресной арифметики {$POINTERMATH ON} и производить вычисления с указателями любого типа.
http://docs.embarcadero.com/products/rad_s...ermath_xml.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 26.3.2013, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Alexeis @  26.3.2013,  09:36 Найти цитируемый пост)
В новых версиях можно включить режим адресной арифметики {$POINTERMATH ON} и производить вычисления с указателями любого типа

а с PByte даже включать не нужно


--------------------
Обижено школьников: 8
PM MAIL   Вверх
drkot
Дата 26.3.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(Alexeis @  26.3.2013,  09:36 Найти цитируемый пост)
В новых версиях можно включить режим адресной арифметики 

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


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

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

Цитата(bems @  26.3.2013,  15:42 Найти цитируемый пост)
а с PByte даже включать не нужно

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

Спасибо всем


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
bems
Дата 26.3.2013, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(drkot @  26.3.2013,  20:20 Найти цитируемый пост)
На это как раз и ругается

тип PByte объявлен в режиме POINTERMATH ON поэтому адресная арифметика для него работает даже там где POINTERMATH OFF
если ХЕ3 ругается это значит что или ты что-то напутал, или что в ХЕ3 совсем всё поломали. последний вариант мне кажется очень правдоподобным


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Чучмек
Дата 26.3.2013, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



В xe3 работает.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Alexeis
Дата 26.3.2013, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Я думаю что дело как раз в том что 
Цитата(drkot @  26.3.2013,  21:20 Найти цитируемый пост)
TMyType = PByte. Так если переменные TMyType ругается на несовместимость


TMyType ведь не объявлен в режиме POINTERMATH ON 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Чучмек
Дата 26.3.2013, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Не работает сложение.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
bems
Дата 26.3.2013, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Alexeis @  26.3.2013,  21:37 Найти цитируемый пост)
TMyType ведь не объявлен в режиме POINTERMATH ON 
в ХЕ2 это ничего не меняет


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

какое именно?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Чучмек
Дата 26.3.2013, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата(bems @  26.3.2013,  22:08 Найти цитируемый пост)
какое именно? 

бессмысленное - указатель с указателем.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Alexeis
Дата 26.3.2013, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Бессмысленная арифметика и не работает. Работает указатель + число и указатель - указатель. На указатель + указатель работает защита от дурака.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 26.3.2013, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Чучмек @  26.3.2013,  22:15 Найти цитируемый пост)
бессмысленное - указатель с указателем. 

аа, ну это да. Так оно и с PChar не работает smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 27.3.2013, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(bems @  26.3.2013,  22:26 Найти цитируемый пост)
аа, ну это да. Так оно и с PChar не работает

Вот интересно. А компиляторы Си такое сложение пропускают?
Сейчас под руками нет ничего что-бы проверить.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
drkot
Дата 27.3.2013, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(northener @  27.3.2013,  00:07 Найти цитируемый пост)
 А компиляторы Си такое сложение пропускают?

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

Цитата(bems @  26.3.2013,  20:54 Найти цитируемый пост)
или что в ХЕ3 совсем всё поломали

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

Насколько понимаю тенденция в сторону ужесточения синтаксиса.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
bems
Дата 27.3.2013, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



я с ХЕ на ХЕ2 перешел оч легко. строки были уже в порядке, потому что переход на уникод был раньше и отдельно
асм допустим, только в варианте полностью ассемблерных процедур

а что с var-параметрами?

Добавлено через 3 минуты и 32 секунды
Цитата(northener @  27.3.2013,  00:07 Найти цитируемый пост)
А компиляторы Си такое сложение пропускают?

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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 27.3.2013, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(bems @  27.3.2013,  11:18 Найти цитируемый пост)
да не, в этом же нет никакого смысла.
ну если вдруг какой и пропускает, то меня бы это сильно удивило 

  Не пропускают компиляторы С++, потому что адресная арифметика в делфи стыбжена как раз из языка С . Если очень нужно могу накопать учебник какой или стандарт, но я сам проверял и компилятор ругался, причем ругался не ворнингом а ерором. Единственный вариант просуммировать указатели это привести один из указателей к целому числу. 

Вот выдержка из стандарта языка С99  о допустимых операндах в арифметических выражениях
Цитата(6.5.6 Additive operators)

2)For addition, either both operands shall have arithmetic type, or one operand shall be a
pointer to an object type and the other shall have integer type. (Incrementing is
equivalent to adding 1.)
3 For subtraction, one of the following shall hold:
—both operands have arithmetic type;
90) This is often called ‘ ‘truncation toward zero’ ’.
82 Language §6.5.6
WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3
—both operands are pointers to qualified or unqualified versions of compatible object
types; or
—the left operand is a pointer to an object type and the right operand has integer type.
(Decrementing is equivalent to subtracting 1.)

Дальше идет уточнение по этим пунктам. Операция сложения указателей не определена стандартом. 

Это сообщение отредактировал(а) Alexeis - 27.3.2013, 20:09


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1123 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.