Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Максимальное значение разности двух Pointer`ов.


Страницы:   1 2

LightRipple ©   (2008-06-01 16:57:00) 

Здравствуйте !
Может ли "в реальной жизни" разность двух Pointer`ов не уместиться в integer ?
(разность нам важна со знаком)
Суть в следующем: есть чужая структура с изменяемым размером.
Есть в ней "лишнее" поле ULONG. Вот туда я и хочу запихать эту разность :)


guav   (2008-06-01 23:31:00) [1]

$2C000000 вполне выделяемый при LARGEADDRESSAWARE адрес, при том что выделяемые адреса могут быть и меньше $00400000, в результате разница указателей может превысить Maxint. MAXDWORD конечно не превысит никак, т.к. каждый указатель из вычитаемых от 0 до MAXDWORD.


Игорь Шевченко   (2008-06-01 23:22:00) [2]


> Если не считать некоторые тонкости, например PAE то это
> так.


Собственно, даже при PAE не превышает :)


Anatoly Podgoretsky   (2008-06-01 23:18:00) [3]

Если не считать некоторые тонкости, например PAE то это так.


Игорь Шевченко   (2008-06-01 22:57:00) [4]


> // может не выполнится при переходе через MAXDWORD


Указатели не переходят через MAXDWORD, адресное пространство в Win32 не превышает 4 Гб :)


LightRipple   (2008-06-01 18:42:00) [5]

Уфф. Вроде, осознала :)
Спасибо всем большое !


guav   (2008-06-01 18:12:00) [6]

в C/C++ есть ptrdiff_t.

Насчёт уместится в Longint. Один характерный пример того, о чём говорит Sha.
T1, T2: DWORD;
T1 := GetTickCount();
..
T2 := GetTickCount();
if T1 <= T2 then // может не выполнится при переходе через MAXDWORD
if T2 - T1 >= 0 then // всегда выполнится (если конечно время выполнения ... не превысит половину MAXDWORD

, поэтому
if T2 - T1 < 5000 then // всегда проверит разница меньше 5 сек или нет, даже если T2 = MAXDWORD минус копейки


Anatoly Podgoretsky   (2008-06-01 18:01:00) [7]

> LightRipple  (01.06.2008 17:43:19)  [19]

Может, поскольку диапазон до 4 гб.
Советую все таки взглянуть справку по целым типам


Anatoly Podgoretsky   (2008-06-01 17:57:00) [8]

> Ум_ще  (01.06.2008 17:39:16)  [16]

Да беззнаковый, а как тебе нравится Cardinal не 32 бита, а 31? А такое было.


Anatoly Podgoretsky   (2008-06-01 17:57:00) [9]

> Ум_ще  (01.06.2008 17:37:14)  [14]

Потому что над Integer можно выполнять арифметические операции, а больше приводить не к чему, поскольку с Cardinal всегда были проблемы, Борланд долго не мог решить, что же это такое, а dWord этот вообще имел приведение к самым разным типам. Но для этого надо помнить историю, начиная с Д2 и по наши годы.


Anatoly Podgoretsky   (2008-06-01 17:55:00) [10]

> Ум_ще  (01.06.2008 17:34:13)  [13]

Pointer это предопределенный тип, а это было приведено для понимания, pointer эквивалентен Cardinal или DWord, равносилен беззнаковому целому.


Anatoly Podgoretsky   (2008-06-01 17:51:00) [11]

> LightRipple  (01.06.2008 17:28:11)  [11]

Дельфи нормально работает с указателями за 2 гб, иначе бы работа была просто не возможна, почти все системные библиотеки находятся там


Sha   (2008-06-01 17:51:00) [12]

> Ум_ще   (01.06.08 17:42) [18]
> То, что Cardinal (DWord) - это "масло масляное".

Согласен, но это не мое

> Pointer в Delphi - знаковый тип

Чего?


LightRipple   (2008-06-01 17:45:00) [13]

> [12] Sha ©   (01.06.08 17:31)
> Поэтому если для 32-битовых чисел A=B-C, то всегда будет B=A+C.
> И для знаковых и для беззнаковх. Все нормально поместится.
> Только на переполнение и на знак не обращай внимания :)

Вот такое положение вещей мне очень понравилось :)


Sha   (2008-06-01 17:45:00) [14]

> LightRipple ©   (01.06.08 17:43) [19]
> Может ли DWord(DWord(pBuf) - DWord(pOldBuf)) оказаться больше MAXINT ?

Какая тебе разница? чем это плохо?


LightRipple   (2008-06-01 17:43:00) [15]

Наверное плохо сформулировала вопрос.
Попробую еще раз:

pBuf, pOldBuf: Pointer;
begin
....
pOldBuf := pBuf;
RallocMem(pBuf, 454);
Может ли DWord(DWord(pBuf) - DWord(pOldBuf)) оказаться больше MAXINT ?


Ум_ще   (2008-06-01 17:42:00) [16]

То, что Cardinal (DWord) - это "масло масляное".
Pointer в Delphi - знаковый тип.


Sha   (2008-06-01 17:41:00) [17]

Ну и что?


Ум_ще   (2008-06-01 17:39:00) [18]


> Sha ©   (01.06.08 17:38) [15]
> Потому, что по барабану, см [12]


Я то согласен. только Cardinal - беззнаковый тип. см. [10]


Sha   (2008-06-01 17:38:00) [19]

Потому, что по барабану, см [12]


Ум_ще   (2008-06-01 17:37:00) [20]

Канту в примерах приводит Pointer к Integer. Но не описывает, почему.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо