Вниз
Скачать: CL | DM;

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

← →
LightRipple ©   (2008-06-01 16:57) [0]

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


← →
Amoeba ©   (2008-06-01 17:02) [1]


> разность двух Pointer`ов

А на кой она нужна?


← →
SergeyIT   (2008-06-01 17:05) [2]


> Может ли "в реальной жизни" разность двух Pointer`ов не уместиться в integer ?

Да. ULONG <> integer.


← →
LightRipple ©   (2008-06-01 17:10) [3]

>  [1] Amoeba ©   (01.06.08 17:02)
> А на кой она нужна?

Бывает полезна, когда мы не хотим каждый раз вызывать функцию
для получения адреса, а хотим иметь готовый указатель :)


← →
LightRipple ©   (2008-06-01 17:12) [4]

>  [2] SergeyIT   (01.06.08 17:05)
> Да. ULONG <> integer.

Это я знаю. Потому и спросила: "в реальной жизни".


← →
Ум_ще   (2008-06-01 17:13) [5]


> двух Pointer`ов не уместиться в integer ?


Каким образом?
Абсолютное значение (Long)-(Long) не может быть более Abs(Int)


← →
LightRipple ©   (2008-06-01 17:23) [6]

> [5] Ум_ще   (01.06.08 17:13)

Т.е. DWord(Pointer) не может быть больше MAXINT. Так ?


← →
Ум_ще   (2008-06-01 17:23) [7]


> Т.е. DWord(Pointer) не может быть больше MAXINT. Так ?


Не так.
Разность не может быть больше.


← →
Ум_ще   (2008-06-01 17:25) [8]

+вспомни, что Delphi не может работать с указателями,превышающими 2Гб памяти


← →
Anatoly Podgoretsky ©   (2008-06-01 17:26) [9]

> LightRipple  (01.06.2008 16:57:00)  [0]

Не может 4 gb(23bit) - 0 = 4 gb, аналогично для 64 бит


← →
Anatoly Podgoretsky ©   (2008-06-01 17:27) [10]

> LightRipple  (01.06.2008 17:23:06)  [6]

Pointer это не Integer, а Cardinal (DWord)


← →
LightRipple ©   (2008-06-01 17:28) [11]

> [8] Ум_ще   (01.06.08 17:25)
> +вспомни, что Delphi не может работать с указателями,превышающими 2Гб памяти

А "другие" умеют ?


← →
Sha ©   (2008-06-01 17:31) [12]

> LightRipple ©   (01.06.08 16:57)  
> разность нам важна со знаком

Процессор для 32-битового сложения и вычитания использует
одни и те же команды. Есть знак или нет знака - это только в
твоем воображении.

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


← →
Ум_ще   (2008-06-01 17:34) [13]


> Anatoly Podgoretsky ©   (01.06.08 17:27) [10]
> > LightRipple  (01.06.2008 17:23:06)  [6]Pointer это не
> Integer, а Cardinal (DWord)


Анатолий, в каком модуле это определение?


← →
Ум_ще   (2008-06-01 17:37) [14]

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


← →
Sha ©   (2008-06-01 17:38) [15]

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


← →
Ум_ще   (2008-06-01 17:39) [16]


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


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


← →
Sha ©   (2008-06-01 17:41) [17]

Ну и что?


← →
Ум_ще   (2008-06-01 17:42) [18]

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


← →
LightRipple ©   (2008-06-01 17:43) [19]

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

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


← →
Sha ©   (2008-06-01 17:45) [20]

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

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


← →
LightRipple ©   (2008-06-01 17:45) [21]

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

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


← →
Sha ©   (2008-06-01 17:51) [22]

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

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

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

Чего?


← →
Anatoly Podgoretsky ©   (2008-06-01 17:51) [23]

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

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


← →
Anatoly Podgoretsky ©   (2008-06-01 17:55) [24]

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

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


← →
Anatoly Podgoretsky ©   (2008-06-01 17:57) [25]

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

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


← →
Anatoly Podgoretsky ©   (2008-06-01 17:57) [26]

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

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


← →
Anatoly Podgoretsky ©   (2008-06-01 18:01) [27]

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

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


← →
guav ©   (2008-06-01 18:12) [28]

в 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 минус копейки


← →
LightRipple ©   (2008-06-01 18:42) [29]

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


← →
Игорь Шевченко ©   (2008-06-01 22:57) [30]


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


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


← →
Anatoly Podgoretsky ©   (2008-06-01 23:18) [31]

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


← →
Игорь Шевченко ©   (2008-06-01 23:22) [32]


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


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


← →
guav ©   (2008-06-01 23:31) [33]

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.012 c
15-1210752135
Петр
2008-05-14 12:02
2008.06.29
Проблема с установкой Касперского


15-1210535348
Тимохов
2008-05-11 23:49
2008.06.29
Firewall COMODO


2-1212256392
Wildyt
2008-05-31 21:53
2008.06.29
Дан файл, состоящий из чисел


15-1210861488
@!!ex
2008-05-15 18:24
2008.06.29
Помогите справится с MSVC++ проектом


2-1212269187
Randew
2008-06-01 01:26
2008.06.29
Помогите найти ошибку, пожалуйста...




   Наверх