Форум: "Начинающим";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
ВнизЦелочисленные типы с указанием разрядности Найти похожие ветки
← →
PinDOS (2010-08-23 16:36) [0]Задумался о указании разрядности в названии целочисленных типов (в некоторых случаях надо что бы разрядность не зависела от компилятора, железа и ОС и что бы было очевидно какую разрядность имеет переменная), с этой целью сделал свой модуль, где написал примерно следующее (что и породило еще больше вопросов)
Int8U = Byte;
Int8S = ShortInt;
Int16U = Word;
Int16S = SmallInt;
Int32U = Cardinal;
Int32S = LongInt;
// Читал что тип Integer в некоторых Pascal-компиляторах
// зависит от разрядности системы в которой
// компелировался код (касательно компилятора используемого Lazarus"сом),
// правда ли это и что будет с другими типами на другом железе и ОС?
Int64U = Int64;
IntS = Integer; // на тот случай если мне безразлична разрядность
Попытка использовать эти типы сделала код затруднительным к прочтению (все таки непривычные типы данных), допустим ли такой подход и как решается изложенная в начале проблема профессионалами? :)
← →
Anatoly Podgoretsky © (2010-08-23 16:39) [1]Вертай все взад.
← →
Сергей М. © (2010-08-23 16:45) [2]
> что бы разрядность не зависела от компилятора, железа и
> ОС
Гы..
А сам при этом жество обозначил эту зависимость в именах идентификаторов)
← →
Юрий Зотов © (2010-08-23 16:47) [3]> как решается изложенная в начале проблема профессионалами
Никак не решается. У них этой проблемы просто нет. Не так уж трудно запомнить разрядность всего лишь 8 типов. Тем более, что названия 5 из них говорят сами за себя (учитывая generic) - так что запоминать надо всего 3.
← →
PinDOS (2010-08-23 17:06) [4]
> Вертай все взад.
почему?
> Гы..
Я имел ввиду что бы разрядность выбирал я, а не компилятор
> Не так уж трудно запомнить разрядность всего лишь 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 17:32) [5]> надо быть готовым переломить себя
Как только Вы объясните мне зачем и почему мне надо себя ломать, я немедленно начну это делать.
← →
Сергей М. © (2010-08-23 17:40) [6]
> что бы разрядность выбирал я, а не компилятор
Ну и выбирай себе на здоровье из имеющихся)
Зачем свои-то типы плодить без явной надобности ?
Просто не используй типы Integer и Cardinal - они платформозависимы
← →
RWolf © (2010-08-23 18:10) [7]А кто в курсе, зачем разрабы FreePascal вообще сделали этот финт ушами с разрядностью Integer? многовато порядка в языке — надо, чтобы как в Си?
← →
Юрий Зотов © (2010-08-23 18:29) [8]
> Сергей М. © (23.08.10 17:40) [6]
Или наоборот - использовать только такие. Тогда исходный код будет платформонезависимым.
← →
Сергей М. © (2010-08-23 18:35) [9]
> Юрий Зотов © (23.08.10 18:29) [8]
Ну автор-то как раз таки и не желает полагаться на платформонезависимость.
Ему, как я понял, нужно чтобы, скажем, переменная некоего типа при любом "раскладе" занимала 2 байта и ни битом больше/меньше).. Но при этом тип Word или SmallInt его почему-то не устраивает..
← →
0x00FF00 © (2010-08-23 19:06) [10]
> Или наоборот - использовать только такие. Тогда исходный
> код будет платформонезависимым.
Да ни фига.
Скажем, если в 64-битном окружении скомпилировать сдвиг Cardinal на 48 разрядов вправо, то это будет нормально.
А вот если в 32-разрядном — тады ой.
← →
PinDOS (2010-08-23 19:29) [11]
> Но при этом тип 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
← →
Anatoly Podgoretsky © (2010-08-23 19:32) [12]
> имел ввиду что бы разрядность выбирал я, а не компилятор
Используй только фундаментальные типы.
← →
0x00FF00 © (2010-08-23 19:51) [13]Cardinal меняй на DWORD, Integer на LongInt.
И наступит щастье.
← →
icWasya © (2010-08-24 10:43) [14]А вот переводить программу на другой язык - например с Pascal на C# или с C++ на Delphi - вот тогда и попробуйте понять - что означает short - в си и дельфи это разные вещи.
А когда есть набор типов Int8,uInt8 ... Int64 - тогда меньше головной боли.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c