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

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

Целочисленный тип для операций с указателями


PinDOS ©   (2010-08-24 21:57:00) 

Здравствуйте уважаемые мастера!

Для простых операций с указателем (Pointer) всегда применял тип Cardinal. К примеру
Cardinal(P1) := Cardinal(P2) + 4;
Но что делать если компилятор будет 64-разрядным, Pointer тогда занимает 8байт, а Cardinal так и останется 4. В FPC сделан отдельный целочисленный тип для таких операций. Как называется такой тип в делфи (если он есть)?

Спасибо!


Anatoly Podgoretsky   (2010-08-25 12:44:00) [1]


> я это взял из документации FPC

Это другой продукт, к Дельфи отношения не имеет. Да хоть размером в байт, их право.


PinDOS   (2010-08-25 12:11:00) [2]

С вопросом разобрался, компилятора Delphi 64 нету, просто написал с использованием директив ifdef что в делфи PtrUInt = DWord;
Трудно было просто ответить, почему надо троллить

> Anatoly Podgoretsky

я это взял из документации FPC ( http://wiki.freepascal.org/Integer)

> sniknik

я не хочу что бы получилось Access violation at adress ... из-за того что платформозависимый тип "пересекся" с платформонезависимым

> Германн

спс за совет

Спасибо)


Anatoly Podgoretsky   (2010-08-25 06:43:00) [3]

> PinDOS  (24.08.2010 23:57:06)  [6]

> 64 бита      Cardinal        4

Ты это сам придумал, или тебе Борланд сообщил?


Германн   (2010-08-25 02:43:00) [4]


> ты вообще чего хочешь?

Тут что-то родственное мне железячнику, имхо.
Автор использует packed record и хочет добиться совместимости с любымкомпилятором паскаля.
Зачем это нужно - это вопрос к автору.


sniknik   (2010-08-25 00:33:00) [5]

Сергей М. ©   (23.08.10 17:40) [6]

> что бы разрядность выбирал я, а не компилятор

Ну и выбирай себе на здоровье из имеющихся)
Зачем свои-то типы плодить без явной надобности ?
Просто не используй типы Integer и Cardinal - они платформозависимы

после этого сомнения что то, что
> 64 бита      Cardinal         4 <-- вот в этом

ты вообще чего хочешь? выбирать разрядность самому это прямо противоположное тому, что в этой ветке, чтобы типы были платформозависимы.


sniknik   (2010-08-25 00:25:00) [6]

> т.е. они integer-у синоним придумали? молодцы какие...


PinDOS   (2010-08-25 00:20:00) [7]


> Cardinal, оно не равно integer, в этом есть скрытый смысл

ни в одном моем комментарии до сего не было упоминания типа integer (PtrUInt - Pointer UnignedInteger)


sniknik   (2010-08-25 00:18:00) [8]

Cardinal, оно не равно integer, в этом есть скрытый смысл


PinDOS   (2010-08-24 23:57:00) [9]


> лавры

-----------------------------
Система       Тип       Размер
-----------------------------
32 бита      Cardinal        4
                Pointer        4
                PtrUInt        4
-----------------------------
64 бита      Cardinal        4
                Pointer        8
                PtrUInt        8
-----------------------------
4, оно не равно 8, в этом есть скрытый смысл


sniknik   (2010-08-24 23:26:00) [10]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1282567015&n=18
а, понял, лавры FPC покоя не дают. решил переплюнуть, на одном синониме не останавливаться.


sniknik   (2010-08-24 23:24:00) [11]

> в FPC
> PtrUInt(P1) := PtrUInt (P2)  + 124; // будет верный результат и на 32 и на 64 битной системе
т.е. они integer-у синоним придумали? молодцы какие...


PinDOS   (2010-08-24 22:57:00) [12]


> 4

просто число, это для примера, можно 124
> как тока делфя станет х64 то сразу Pointer64 появится ну
> а Int64 уже есть

оно то появится, вот только:
QWord(P1) := QWord(P2) + 124; // в 32х битной системе будет не знаю что
// и хотелось бы избежать этого
// в то время как
Cardinal(P1) := Cardinal(P2) + 124; // в 64-битной системе результат будет неверный


в FPC
PtrUInt(P1) := PtrUInt (P2)  + 124; // будет верный результат и на 32 и на 64 битной системе


Eraser   (2010-08-24 22:42:00) [13]

> [0] PinDOS   (24.08.10 21:57)

Cardinal станет 64 разрядным.

> Cardinal(P1) := Cardinal(P2) + 4;

таких записей лучше избегать или писать так
Cardinal(P1) := Cardinal(P2) + SizeOf(Pointer);


QAZ   (2010-08-24 22:08:00) [14]

как тока делфя станет х64 то сразу Pointer64 появится ну а Int64 уже есть


Наверх

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