![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Целочисленные типы с указанием разрядности
PinDOS © (2010-08-23 16:36:00)Задумался о указании разрядности в названии целочисленных типов (в некоторых случаях надо что бы разрядность не зависела от компилятора, железа и ОС и что бы было очевидно какую разрядность имеет переменная), с этой целью сделал свой модуль, где написал примерно следующее (что и породило еще больше вопросов)
Int8U = Byte;
Int8S = ShortInt;
Int16U = Word;
Int16S = SmallInt;
Int32U = Cardinal;
Int32S = LongInt;
// Читал что тип Integer в некоторых Pascal-компиляторах
// зависит от разрядности системы в которой
// компелировался код (касательно компилятора используемого Lazarus'сом),
// правда ли это и что будет с другими типами на другом железе и ОС?
Int64U = Int64;
IntS = Integer; // на тот случай если мне безразлична разрядность
Попытка использовать эти типы сделала код затруднительным к прочтению (все таки непривычные типы данных), допустим ли такой подход и как решается изложенная в начале проблема профессионалами? :)
icWasya (2010-08-24 10:43:00) [1]А вот переводить программу на другой язык - например с Pascal на C# или с C++ на Delphi - вот тогда и попробуйте понять - что означает short - в си и дельфи это разные вещи.
А когда есть набор типов Int8,uInt8 ... Int64 - тогда меньше головной боли.
0x00FF00 (2010-08-23 19:51:00) [2]Cardinal меняй на DWORD, Integer на LongInt.
И наступит щастье.
Anatoly Podgoretsky (2010-08-23 19:32:00) [3]
> имел ввиду что бы разрядность выбирал я, а не компилятор
Используй только фундаментальные типы.
PinDOS (2010-08-23 19:29:00) [4]
> Но при этом тип Word или SmallInt его почему-то не устраивает.
Занимался простой обработкой изображений - быстрая прорисовка прозрачного изображения на другом, растягивание, сжатие картинок... Ставил режим 32бита, потому пиксель занимал 4 байта (Red, Blue, Green, Opacity), доступ к цветовым компонентам производил через тип
RDWord = packed record
case Integer of
0: (B: array [0..3] of Byte);
1: (DW: Cardinal);
2: (W: array [0..1] of Word);
4: (Int: Integer);
end;
собственно для этого и решил ввести другие наименования типов, тут названия Int32U мне кажутся более подходящими (нету под рукой переделанного примера), но в остальном коде это выглядит непривычно, а люди воспринимают это в штыки, я потому и спрашиваю, как сделать так что бы красиво было, но и чтобы код был един и не писать там Cardinal, а там Int32U
0x00FF00 (2010-08-23 19:06:00) [5]
> Или наоборот - использовать только такие. Тогда исходный
> код будет платформонезависимым.
Да ни фига.
Скажем, если в 64-битном окружении скомпилировать сдвиг Cardinal на 48 разрядов вправо, то это будет нормально.
А вот если в 32-разрядном — тады ой.
Сергей М. (2010-08-23 18:35:00) [6]
> Юрий Зотов © (23.08.10 18:29) [8]
Ну автор-то как раз таки и не желает полагаться на платформонезависимость.
Ему, как я понял, нужно чтобы, скажем, переменная некоего типа при любом "раскладе" занимала 2 байта и ни битом больше/меньше).. Но при этом тип Word или SmallInt его почему-то не устраивает..
Юрий Зотов (2010-08-23 18:29:00) [7]
> Сергей М. © (23.08.10 17:40) [6]
Или наоборот - использовать только такие. Тогда исходный код будет платформонезависимым.
RWolf (2010-08-23 18:10:00) [8]А кто в курсе, зачем разрабы FreePascal вообще сделали этот финт ушами с разрядностью Integer? многовато порядка в языке — надо, чтобы как в Си?
Сергей М. (2010-08-23 17:40:00) [9]
> что бы разрядность выбирал я, а не компилятор
Ну и выбирай себе на здоровье из имеющихся)
Зачем свои-то типы плодить без явной надобности ?
Просто не используй типы Integer и Cardinal - они платформозависимы
Юрий Зотов (2010-08-23 17:32:00) [10]> надо быть готовым переломить себя
Как только Вы объясните мне зачем и почему мне надо себя ломать, я немедленно начну это делать.
PinDOS (2010-08-23 17:06:00) [11]
> Вертай все взад.
почему?
> Гы..
Я имел ввиду что бы разрядность выбирал я, а не компилятор
> Не так уж трудно запомнить разрядность всего лишь 8 типов
Выдержка из документации по FreePascal ( http://www.freepascal.org/docs-html/ref/refsu5.html)
Type Range Size in bytes
Byte 0 .. 255 1
Shortint -128 .. 127 1
Smallint -32768 .. 32767 2
Word 0 .. 65535 2
Integer either smallint or longint size 2 or 4
Cardinal longword 4
Longint -2147483648 .. 2147483647 4
Longword 0 .. 4294967295 4
Int64 -9223372036854775808 .. 9223372036854775807 8
QWord 0 .. 18446744073709551615 8
Делфи хорошая среда разработки, но надо быть готовым переломить себя и оч. не хочется что бы в далеких недрах кода сбойнула какая то мелочь
Юрий Зотов (2010-08-23 16:47:00) [12]> как решается изложенная в начале проблема профессионалами
Никак не решается. У них этой проблемы просто нет. Не так уж трудно запомнить разрядность всего лишь 8 типов. Тем более, что названия 5 из них говорят сами за себя (учитывая generic) - так что запоминать надо всего 3.
Сергей М. (2010-08-23 16:45:00) [13]
> что бы разрядность не зависела от компилятора, железа и
> ОС
Гы..
А сам при этом жество обозначил эту зависимость в именах идентификаторов)
Anatoly Podgoretsky (2010-08-23 16:39:00) [14]Вертай все взад.