Основные типы данных в системах BCB и Delphi
Опубликовано admin в Ср, 01/06/2010 - 00:15
В программах на Си и Паскале все переменные должны быть объявлены. Причем Паскаль предъявляет гораздо более жесткие требования — описание переменных должно предшествовать первому исполняемому оператору программы. Язык С++ более либерален — он позволяет объявлять переменные по ходу программы, но использует специальное соглашение по поводу области видимости (доступности) таких переменных. Например, переменная j, объявленная в цикле, после выхода из цикла становится недоступной:
for(int j=0, s=0; j<n; j++) s=s+a[j];
Зона видимости переменной, объявленной внутри функции Си, является блок, в котором такое описание появилось. Это не согласуется с тем, что было реализовано в системе Borland C++ 3.1. Там зона видимости переменной распространялась и на ту часть функции, которая находилась ниже блока. Но в BCB стандарт C++ соблюдается более четко.
Принципиальной новинкой в Delphi является возможность задания начального значения переменной в строке объявления. Раньше Паскаль допускал такое присвоение только в разделе const, и из книги в книгу кочевали такие несуразицы как типизированные константы. На самом деле, это были обычные переменные, но уж слишком долго Паскаль не разрешал того, что было принято в большинстве алгоритмических языков. Кстати, Visual Basic пока еще до этого удобного способа не созрел.
По сравнению с системой Visual Basic целочисленные данные в BCB и Delphi в каждом из форматов (1, 2, и 4 байт) допускают по два варианта представления — со знаком и без знака (табл. 1.3). Кроме того, здесь появились целочисленные данные учетверенной длины (8 байт), которые немного отличаются от данных типа Currency.
Диапазон вещественных данных по сравнению с Visual Basic здесь расширен за счет 10-байтовых чисел с плавающей запятой, имеющих до 19–20 верных значащих цифр.
Логические значения, похожие на общепринятые true или false, а также логические операции, в том числе и поразрядные, в Си были известны с самого начала. Однако в качестве логических значений выступали данные целочисленного типа или их отдельные биты, а знаки общепринятых логических операций (OR, AND, XOR, NOT) были заменены очень специфической символикой (|, &, ^, !, ~, &&, ||). Появление данных типа bool приблизило Си к общепринятой схеме обозначений, хотя и не внесло ничего принципиально нового.
Данные типа Currency перекочевали из входного языка VB сначала в систему Delphi, а потом и в BCB. Над денежными единицами в классе Currency определены все арифметические операции, свойственные целочисленным данным в языке Си:
+, +=, ++, -, -=, --, *, *=, /, /=, %, %=
Данные типа Currency можно сравнивать (>, >=, <, <=, ==, !=). Им можно присваивать любые целочисленные или вещественные значения из допустимого интервала. Для преобразования денежных единиц в строку программа может воспользоваться функцией AnsiString:
Currency s=s1+s2;
ShowMessage(AnsiString(s));
Множества впервые появились в Паскале. В соответствующий класс BCB их идеология перенесена в несколько урезанном виде. Элементами класса Set могут быть данные типа int, char или enum, принадлежащие ограниченному интервалу от минимального значения (min) до максимального значения (max) и содержащие не более 256 элементов. Минимальное значение должно быть не менее 0, а максимальное — не более 255.
Объявить множество можно явно или косвенно:
Set <char,'A','Z'> s1; //множество s1 больших букв от A до Z
typedef Set <int, 10,20> Num10_20;
Num10_20 s2,s3; // два множества целых чисел от 10 до 20
enum M_K_Key (ssShift, ssAlt, ssCtrl, ssLeft, ssRight,
ssMiddle, ssDouble); //управляющие клавиши
typedef Set<M_K_Key,ssShift,ssDouble> TShiftState;
TShiftState Shift; //множество управляющих клавиш
После объявления любое множество является пустым и его заполнение возлагается на программу. Подключение элемента из допустимого интервала осуществляется с помощью операции <<:
s1 << 'A'<< 'C';
s2 << 12 << 10 << 19;
MessageDlg(as,mtInformation,TMsgDlgButton<<mbOk<<mbCancel,0);
Операция >> используется для исключения элемента из множества:
s2 >> 19;
С помощью метода Clear можно удалить все данные из множества:
s1.Clear();
Для проверки на принадлежность элемента множеству предназначен метод Contains:
bool b1=s1.Contains('C')
Он возвращает значение true, если указанный элемент в данный момент принадлежит множеству.
Над элементами двух множеств определены стандартные операции объединения (операция + или +=), пересечения (операция * или *=) и вычитания (операция - или
-=). Два множества можно сравнивать на совпадение (операция ==) или несовпадение (операция !=).
Данные типа Variant, впервые появившиеся в VB, были предназначены для обмена разнотипной информацией. При каждом таком значении хранятся сведения о его типе, а класс Variant снабжен сервисными программами по преобразованию данных одного типа в другой. В качестве значений типа Variant система BCB допускает использование практически всех числовых данных (short, int, float, double, Currency, TDateTime), логических величин (bool, WordBool), указателей на строки (char *, AnsiString&, wchar_t *) и объекты типа OLE Automation. В последнем случае значение типа Variant может использоваться для опроса/установки свойств OLE-объекта или вызова его методов.
Таблица 1.3
| Тип Delphi | Тип BCB | Диапазон | Формат |
| Целые числа | |||
| ShortInt | signed char | от -128 до 127 | 8 бит со знаком |
| Byte | unsigned char | от 0 до 255 | 8 бит без знака |
| SmallInt | short | от -32768 до 32767 | 16 бит со знаком |
| Word | unsigned short | от 0 до 65567 | 16 бит без знака |
| Integer, Longint | integer, long |
от -2147483648
до 2147483647 |
32 бита со знаком |
| Cardinal | unsigned int | от 0 до 4294967295 | 32 бита без знака |
| Int64 | int64 | от -263 до 263-1 | 64 бита со знаком |
| Currency | Currency | от -922337203685477.5808
до + 922337203685477.5807 |
64 бита со знаком (*10-4) |
| Вещественные числа | |||
| Single, Real | float | от -3.4*1038 до-1.4*10-45 , 0
и от 1.4*10-45 до 3.4*1038 |
32 бита, пл. зпт. |
| Double | double | от -1.8*10308 до -4.9*10-324, 0
и от 4.9*10-324 до 1.8*10308 |
64 бита, пл. зпт. |
| Comp | Comp | от -263 до 263-1 | 64 бита, пл.зпт. |
| Extended | long double | от -1.1*104932 до -3.4*10-4932, 0
и от 3.4*10-4932 до 1.1*104932 |
80 бит, пл. зпт. |
| Логические данные | |||
| Boolean | bool | true или false | 8 бит |
| ByteBool | unsigned char | true/false или целое без знака | 8 бит |
| WordBool | true/false или целое без знака | 16 бит | |
| LongBool | BOOL | true/false или целое без знака | 32 бита |
| Символьные (строковые) данные | |||
| Char, AnsiChar | char | 8-битовый символ | 8 бит |
| WideChar | wchar_t | 16-битовый символ (Unicode) | 16 бит |
| String[n] | SmallString<n> | строка до 255 символов | |
| String,
AnsiString |
AnsiString | длинная строка до 2 Гбайт | |
| PChar | unsigned char * | указатель на строку | 32 бита |
| Указатель без типа | |||
| Pointer | void * | 32 бита | |
| Календарные даты и время | |||
| TDateTime | TDateTime | 64 бита | |
