Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.14;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
2-1282119287
A_Ton
2010-08-18 12:14
2010.11.14
Запись типизированных файлов больше 2 гиг


15-1280438963
Германн
2010-07-30 01:29
2010.11.14
W7 90-days trial version


2-1282041589
Dmitriy
2010-08-17 14:39
2010.11.14
создание объекта в DLL


2-1282150418
Ярослав
2010-08-18 20:53
2010.11.14
Иконка приложения


2-1282026336
Роман
2010-08-17 10:25
2010.11.14
Выборка одного и того же поля с разными условиями