Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Вниз

Максимальное значение разности двух 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 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
2-1212467689
кот
2008-06-03 08:34
2008.06.29
целое число


4-1192313033
snoopy
2007-10-14 02:03
2008.06.29
Handle на все принтеры установленные в системе


2-1212564137
Trei
2008-06-04 11:22
2008.06.29
Ссылка


2-1212493835
Igor
2008-06-03 15:50
2008.06.29
Treeview


15-1210928266
ekto
2008-05-16 12:57
2008.06.29
Посоветуйте программу для создания 24-битных ресурсов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский