додати матеріал

приховати рекламу

Типи даних в Паскалі

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

Федеральне агентство з освіти
Реферат
«ТИПИ ДАНИХ У Паскаля»
2008

1. Типи даних
Будь-які дані, тобто константи, змінні, властивості, значення функцій або вирази характеризуються своїми типами. Тип визначає безліч допустимих значень, які може мати той чи інший об'єкт, а також безліч допустимих операцій, які застосовні до нього. Крім того, тип визначає також і формат внутрішнього подання даних у пам'яті ПК.
Взагалі мова Object Pascal характеризується розгалуженою структурою типів даних (рис. 1.1). У мові передбачений механізм створення нових типів, завдяки чому загальна кількість використовуваних в програмі типів може бути як завгодно великим.
Оброблювані в програмі дані поділяються на змінні, константи і літерали:
Константи представляють собою дані, значення яких встановлені в розділі оголошення констант і не змінюються в процесі виконання програми.
Змінні оголошуються в розділі оголошення змінних, але на відміну від констант отримують свої значення вже в процесі виконання програми, причому допускається зміна цих значень. До константам і змінним можна звертатися по іменах.
Літерал не має ідентифікатора і представляється у тексті програми безпосередньо значенням.
Тип визначає безліч значень, які можуть приймати елементи даних, і сукупність допустимих над ними операцій.
У цій та чотирьох наступних розділах наводиться докладний опис всіх типів.

1.1 Прості типи
До простих типів відносяться порядкові, речові типи і тип дата-час.
Порядкові типи відрізняються тим, що кожен з них має кінцеву кількість можливих значень. Ці значення можна певним чином упорядкувати (звідси - назва типів) і, отже, з кожним з них можна зіставити деяке ціле число - порядковий номер значення.
Речові типи, строго кажучи, теж мають кінцеве число значень, що визначається форматом внутрішнього подання дійсного числа. Однак кількість можливих значень речових типів настільки велике, що зіставити з кожним з них ціле число (його номер) не представляється можливим.
Тип дата-час призначений для зберігання дати та часу. Фактично для цих цілей він використовує речовинний формат.
1.1.1 Порядкові типи
До порядковим типів відносяться (див. рис. 1.1) цілі, логічні, символьний, що перераховується і тип-діапазон. До будь-якого з них застосовна функція Ord (x), яка повертає порядковий номер значення виразу X.


Рис. 1.1 - Структура типів даних
Для цілих типів функція ord (x) повертає саме значення х, тобто Ord (X) = х для х, що належить будь цілого типу. Застосування Ord (x) до логічного, символьному і перераховуємо типами дає позитивне ціле число в діапазоні від 0 до 1 (логічний тип), від 0 до 255 (символьний), від 0 до 65535 (перераховується). Тип-діапазон зберігає всі властивості базового порядкового типу, тому результат застосування до нього функції ord (х) залежить від властивостей цього типу.
До порядковим типами можна також застосовувати функції:
divd (x) - повертає попереднє значення порядкового типу (значення, яке відповідає порядковому номеру ord (х) -1, тобто оrd (рred (х)) = оrd (х) - 1;
succ (х) - повертає таке значення порядкового типу, яке відповідає порядковому номеру ord (х) +1, тобто оrd (Succ (х)) = оrd (х) + 1.
Наприклад, якщо в програмі визначена змінна
var
з: Char;
begin
з: = '5 ';
end;
то функція PRED (с) поверне символ '4 ', а функція SUCC (с) - символ '6'.
Якщо уявити собі будь-який порядковий тип як впорядкована множина значень, зростаючих зліва направо і займають на числової осі деякий відрізок, то функція divd (x) не визначена для лівого, a succ (х) - для правого кінця цього відрізка.
Цілі типи. Діапазон можливих значень цілих типів залежить від їх внутрішнього подання, яке може займати один, два, чотири або вісім байтів. У табл. 1.1 наводяться назви цілих типів, довжина їх внутрішнього подання в байтах і діапазон можливих значень.
Таблиця 1.1 - Цілі типи
Назва
Довжина, байт
Діапазон значень
Cardinal
4
0. .. 2 147 483 647
Byte
1
0 ... 255
Shortint
1
-128 ... +127
Smallint
2
-32 768 ... +32 +767
Word
2
0 ... 65 535
Integer
4
-2147483648 ... +2 147 483 647
Longint
4
-2147483648 ... +2 147 483 647
Int64
8
-9 * 1018 ... +9 * 1018
LongWord
4
0. . .4 294 967 295
Типи LongWord і Int64 вперше введені у версії 4, а типи Smallint і Cardinal відсутні в Delphi 1. Тип integer для цієї версії займає 2 байти і має діапазон значень від -32768 до +32767, тобто збігається з Smallint.
При використанні процедур і функцій з цілочисельними параметрами слід керуватися "вкладеністю" типів, тобто скрізь, де може використовуватися word, допускається використання Byte (але не навпаки), у Longint "входить" Smallint, який, у свою чергу, включає в себе Shortint.
Перелік процедур та функцій, які можна застосувати до цілочисловим типами, наведено в табл. 1.2. Літерами b, s, w, i, l позначені вираження відповідно типу Byte, Shortint, Word, Integer і Longint,
х - вираз будь-якого з цих типів; букви vb, vs, vw, vi, vl, vx позначають змінні відповідних типів. У квадратних дужках вказується необов'язковий параметр.
Таблиця 1.2 - Стандартні процедури та функції, що застосовуються до цілих типам
Звернення
Тип результату
Дія
abs (x)
x
Повертає модуль x
chr (b)
Char
Повертає символ за його кодом
dec (vx [, i])
-
Зменшує значення vx на i, а при відсутності i - на 1
inc (vx [, i])
-
Збільшує значення vx на i, а при відсутності i-на 1
Hi (w)
Byte
Повертає старший бант аргументу
Hi (I)
Те ж
Повертає третій за рахунком байт
Lo (i)
"
Повертає молодший байт аргументу
Lo (w)
"
Те ж
odd (l)
Boolean
Повертає True, якщо аргумент-непарне число
Random (w)
Як у параметра
Повертає псевдовипадкове число, рівномірно розподілене в діапазоні 0 ... (wl)
sqr (x)
X
Повертає квадрат аргументу
swap (i)
Integer
Міняє місцями байти в слові
swap (w)
Word
Теж
При діях з цілими числами тип результату буде відповідати типу операндів, а якщо операнди відносяться до різних цілим типами - загального типу, який включає в себе обидва операнда. Наприклад, при діях з shortint і word загальним буде тип integer. У стандартній налаштування компілятор Delphi не виробляє код, який здійснює контроль за можливою перевіркою виходу значення з допустимого діапазону, що може призвести до непорозумінь.
Логіки. До логічним відносяться типи Boolean, ByteBool, Bool, wordBool і LongBool. У стандартному Паскалі визначений тільки тип Boolean, інші логічні типи введені в Object Pascal для сумісності з Windows: типи Boolean та ByteBool займають по одному байту кожен, Bool і WordBool - по 2 байти, LongBool - 4 байти. Значеннями логічного типу може бути одна з попередньо оголошених констант False (брехня) або True (істина).
Оскільки логічний тип відноситься до порядковим типами, його можна використовувати в операторі циклу рахункового типу. У Delphi 32 для Boolean значення
Ord (True) = +1, в той час як для інших типів (Bool, WordBool і т.д.)
Ord (True) = -1, тому такого роду оператори слід використовувати з обережністю! Наприклад, для версії Delphi 6 виконуваний оператор showMessage ('---') у наступному циклі for не буде виконаний жодного разу:
var
L: Bool;
k: Integer;
begin
for L: = False to True do
ShowMessage ('--);
end;
Якщо замінити тип параметра циклу L в попередньому прикладі на Boolean, цикл буде працювати і повідомлення двічі з'явиться на екрані. [Для Delphi версії 1 і 2 ord (True) = +1 для будь-якого логічного типу.]
Символьний тип. Значеннями символьного типу є множина всіх символів ПК. Кожному символу приписується ціле число в діапазоні 0 ... 255. Це число є кодом внутрішнього подання символу, його повертає функція ord.
Для кодування в Windows використовується код ANSI (названий на ім'я American National Standard Institute - американського інституту стандартизації, який запропонував цей код). Перша половина символів ПК з кодами 0 ... 127 відповідає таблиці 1.3. Друга половина символів з кодами 128 ... 255 змінюється для різних шрифтів. Стандартні Windows-шрифти Arial Cyr, Courier New Cyr і Times New Roman для представлення символів кирилиці (без літер "е" і "Е") використовують останні 64 коду (від 192 до 256): "А" ... "Я" кодуються значеннями 192 .. 223, "а" ... "Я" - 224 ... 255. Символи "Е" та "е" мають відповідно коди 168 і 184.
Таблиця 1.3 - Кодування символів у відповідності зі стандартом ANSI
Код
Символ
Код.
Символ
Код.
Символ
Код
Символ
0
NUL
32
BL
64
@
96
'
1
ЗОН
33
!
65
А
97
а
2
STX
34
"
66
У
98
b
3
ЕТХ
35
#
67
З
99
з
4
EOT
36
$
68
D
100
d
5
ENQ
37
%
69
Е
101
е
6
ACK
38
&
70
F
102
f
7
BEL
39
'
71
G
103
д
8 '
BS
40
(
72
Н
104
h
9
HT
41
)
73
I
105
i
10
LF
42
*
74
J
106
j
11
VT
43
+
75
До
107
k
12
FF
44
F
76
L
108
1
13
CR
45
-
77
М
109
m
14
SO
46
78
N
110
n
15
SI
47
/
79
0
111
про
16
DEL
48
0
80
Р
112
P
17
DC1
49
1
81
Q
113
q
18
DC2
50
2
82
R
114
r
19
DC3
51
3
83
S
115
s
20
DC 4
52
4
84
Т
116
t
21
NAK
53
5
85
U
117
u
22
SYN
54
6
86
V
118
v
23
ETB
55
7
87
W
119
W
24
CAN
56
8
88
х
120
x
25
EM
57
9
89
Y
121
У
26
SUB
58
:
90
Z
.122
z
27
ESC
59
;
91
t
123
{
28
FS
60
<
92
\
124
1
29
GS
61
=
93
]
125
}
30
RS
62
>
94
Л
126
~
31
US
63
F
95
127
r
Символи з кодами 0 ... 31 відносяться до службових кодами. Якщо ці коди використовуються в символьному тексті програми, вони вважаються пробілами.
До типу char застосовні операції відносини, а також вбудовані функції:
Сhаr (в) - функція типу char; перетворює вираз в типу Byte на символ і повертає його своїм значенням;
UpCase (CH) - функція типу char; повертає велику букву, якщо сн - рядкова латинська буква, в іншому випадку повертає сам символ сн (для кирилиці повертає початковий символ).
Перераховується тип. Перераховується тип задається перерахуванням тих значень, які він може отримувати. Кожне значення іменується деяким ідентифікатором і розташовується в списку, обрамленому круглими дужками, наприклад:
type
colors = (red, white, blue);
Застосування перелічуваних типів робить програми наочніше.
Відповідність між значеннями перечисляемого типу і порядковими номерами цих значень встановлюється порядком перерахування: перше значення в списку отримує порядковий номер 0, друге - 1 і т.д. Максимальна потужність перечисляемого типу складає 65536 значень, тому фактично перераховується тип задає деяку підмножину цілого типу word та може розглядатися як компактне оголошення відразу групи цілочисельних констант зі значеннями 0, 1 і т. д.
Використання перелічуваних типів підвищує надійність програм завдяки можливості контролю тих значень, які отримують відповідні змінні. У Object Pascal допускається зворотне перетворення: будь-який вираз типу Word можна перетворити на значення перераховується типу, якщо тільки значення цілочисельного виразу не перевищує потужності цього типу. Таке перетворення досягається застосуванням автоматично оголошуваної функції з ім'ям перечисляемого типу.
Тип-діапазон. Тип-діапазон є підмножина свого базового типу, в якості якого може виступати будь-який порядковий тип, окрім типу-діапазону.
Тип-діапазон задається межами своїх значень усередині базового типу:
<Мін.знач .>..< макс.знач.>
Тут <хв. знач. > - Мінімальне значення типу-діапазону; <макс. знач. > - Максимальне його значення.
Тип-діапазон не обов'язково описувати в розділі type, а можна вказувати безпосередньо при оголошенні змінної.
При визначенні типу-діапазону потрібно керуватися наступними правилами:
два символи ".." розглядаються як один символ, тому між ними неприпустимі прогалини; ліва межа діапазону не повинна перевищувати його праву межу.
Тип-діапазон успадковує всі властивості свого базового типу, але з обмеженнями, пов'язаними з його меншою потужністю. Зокрема, якщо визначена змінна.
У стандартну бібліотеку Object Pascal включені дві функції, що підтримують роботу з типами-діапазонами:
High (х) - повертає максимальне значення типу-діапазону, до якого належить змінна х;
Low (х) - повертає мінімальне значення типу-діапазону.
1.1.2 Речові типи
На відміну від порядкових типів, значення яких завжди зіставляються з низкою цілих чисел і, отже, представляються в ПК абсолютно точно, значення речових типів визначають довільне число лише з деякою кінцевою точністю, яка залежить від внутрішнього формату дійсного числа.
Таблиця 1.4 - Дійсні типи
Довжина, байт
Назва
Кількість значущих цифр
Діапазон значень
8
4
8
10
8
8
Real
Single
Double
Extended
Comp
Currency
15 ... 16
7 ... 8
15 ... 16
19 ... 20
19 ... 20
19 ... 20
5.0 * 10e-324 ... 1.7 * 10e308
1.5 * 10e-45 ... 3.4 * 10e38
5.0 * 10e324 ... 1.7 * 10e308
3.4 * 10-4951 ... 1.1 * 10e4932
-2e63 ... +2 e63-1
+ / -922 337 203 6854 77,5807
У попередніх версіях Delphi 1 ... 3 тип Real займав 6 байт і мав діапазон значень від 2,9 * 10-39 до 1,7 * 1038. У версіях 4 і 5 цей тип еквівалентний типу Double. Якщо потрібно (в цілях сумісності) використовувати 6-байтних Real, потрібно вказати директиву компілятора {SREALCOMPATIBILITY ON}.
Як видно з табл. 1.4, дійсне число в Object Pascal займає від 4 до 10 суміжних байт і має наступну структуру в пам'яті ПК.
Тут s - знаковий розряд числа; е - експонентна частина; містить двійковий порядок; m - мантиса числа.
Мантиса m має довжину від 23 (для single) до 63 (для Extended) двійкових розрядів, що й забезпечує точність 7 ... 8 для single і 19 ... 20 для Extended десяткових цифр. Десяткова крапка (кома) мається на увазі перед лівим (старшим) розрядом мантиси, але при діях з числом її положення зсувається вліво або вправо відповідно до двійковим порядком числа, що зберігається в експоненційної частини, тому дії над числами називають арифметикою з плаваючою точкою (комою) .
Відзначимо, що арифметичний співпроцесор завжди обробляє числа у форматі Extended, а три інших речових типу в цьому випадку виходять простим усіканням результатів до потрібних розмірів і застосовуються в основному для економії пам'яті.
Особливе становище в Object Pascal займають типи comp і Currency, які трактуються як речові числа з дробовими частинами фіксованої довжини: у comp дробова частина має довжину 0 розрядів, тобто просто відсутня, в currency довжина дробової частини -4 десяткових розряду. Фактично обидва типи визначають велике ціле число зі знаком, що зберігає 19 ... 20 значущих десяткових цифр (у внутрішньому поданні вони займають 8 суміжних байт). У той же час у виразах comp і currency повністю сумісні з будь-якими іншими речовими типами: над ними визначені всі речові операції, вони можуть використовуватися як аргументи математичних функцій і т. д. Найбільш відповідною областю застосування цих типів є бухгалтерські розрахунки.
1.1.3 Тип дата-час
Тип дата-час визначається стандартним ідентифікатором TDateTime і призначений для одночасного зберігання та дати, і часу. У внутрішньому представленні він займає 8 байт і подібно currency являє собою дійсне число з фіксованою дробової частиною: у цілої частини числа зберігається дата, в дробової - час. Дата визначається як кількість діб, які пройшли з 30 грудня 1899 року, а час - як частину доби, що минули з 0 годин, так що значення 36444,837 відповідає даті 11.10.1999 і часу 20:05. Кількість діб може бути і негативним, однак значення менші -693594 (відповідає даті 00.00.0000 від Різдва Христового) ігноруються функціями перетворення дати до строковому типу.
Над даними типу TDateTime визначені ті ж операції, що і над числами, а у виразах цього типу можуть брати участь константи і змінні цілого і речового типів.
Оскільки тип TDateTime сумісний з форматом дійсних чисел, можна без зусиль визначити дату, віддалену від заданої на скільки-то днів вперед або назад: для цього досить відповідно додати до заданої дати або відняти від неї потрібна ціле число.
1.2 Структуровані типи
Будь-який з структурованих типів (а в Object Pascal їх чотири: масиви, записи, множини і файли) характеризується множинністю які складають цей тип елементів. Кожен елемент, у свою чергу, може належати структурованого типу, що дозволяє говорити про можливу вкладеності типів. У Object Pascal допускається довільна глибина вкладеності типів, однак сумарна довжина кожного з них у внутрішньому поданні не повинна перевищувати 2 Гбайт [16-розрядні версії операційної системи Windows З.х використовують так звану "сегментну" модель пам'яті, тому в Delphi 1 будь структурований тип не може займати більше одного сегмента (65536 байт)].
З метою сумісності зі стандартним Паскалем в Object Pascal дозволяється перед описом структурованого типу ставити зарезервоване слово packed, що пропонує компілятору по можливості економити пам'ять, відведену під об'єкти структурованого типу; але компілятор фактично ігнорує цю вказівку: "упаковка" даних в Object Pascal здійснюється автоматаческі скрізь, де це можливо.
1.2.1 Масиви
Масиви в Object Pascal багато в чому схожі з аналогічними типами даних в інших мовах програмування. Відмітна особливість масивів полягає в тому, що всі їх компоненти суть дані одного типу (можливо, структурованого). Ці компоненти можна легко впорядкувати і забезпечити доступ до будь-якого з них простою вказівкою його порядкового номера.
Опис типу масиву задається наступним чином:
<Ім'я типу> = array [<сп.інд.тіпов>] of <тип>;
Тут <ім'я типу> - правильний ідентифікатор; array, of - Зарезервовані слова {масив, з); <сп.інд.тіпов> - список з одного або декількох індексних типів, розділених комами; квадратні дужки, що обрамляють список, - вимога синтаксису; <тип> - будь-який тип Object Pascal.
Як індексних типів у Object Pascal можна використовувати будь-які порядкові типи, що мають потужність не більше 2 Гбайт (тобто крім LongWord і Int64)
Глибина вкладеності структурованих типів взагалі, а, отже, і масивів - довільна, тому кількість елементів у списку індексних типів (розмірність масиву) не обмежена, однак сумарна довжина внутрішнього подання будь-якого масиву не може бути більше 2 Гбайт. У пам'яті ПК елементи масиву слідують один за одним так, що при переході від молодших адрес до старших найбільш швидко змінюється самий правий індекс масиву.
У Object Pascal можна одним оператором присвоєння передати всі елементи одного масиву іншому масиву того ж типу.
1.2.2 Записи
Запис - це структура даних, що складається з фіксованої кількості компонентів, званих полями запису. На відміну від масиву компоненти (поля) записи можуть бути різного типу. Щоб можна було посилатися на той чи інший компонент записи, поля іменуються.
Структура оголошення типу запису така:
<Ім'я типу> = record <сп.полей> end;
Тут <ім'я типу> - правильний ідентифікатор; record / end - зарезервовані слова {запис, кінець); <сп.полей> - список полів; представляє собою послідовність розділів запису, між якими ставиться крапка з комою.
Кожен розділ запису складається з одного або декількох ідентифікаторів полів, що відділяються один від одного комами.
Пропозиція case ... of, що відкриває варіантну частину, зовні схоже на відповідний оператор вибору, але насправді лише грає роль своєрідного службового слова, що означає початок варіантної частини. Саме тому наприкінці варіантної частини не слід ставити end як пару до case ... of. (Оскільки варіантна частина - завжди остання в записі, за неї все ж таки варто end, але лише як пара до record). Ключ вибору в реченні case ... of фактично ігнорується компілятором: єдина вимога, що пред'являється до нього в Object Pascal, полягає в тому, щоб ключ визначав деякий стандартний або попередньо оголошений порядковий тип.
Імена полів мають бути унікальними в межах того запису, де вони оголошені, проте, якщо записи містять поля-запису, тобто вкладені одна в іншу, імена можуть повторюватися на різних рівнях вкладення.

1.2.3 Множини
Множини - це набори однотипних логічно пов'язаних один з одним об'єктів. Характер зв'язків між об'єктами лише мається на увазі програмістом і ніяк не контролюється Object Pascal. Кількість елементів, що входять в безліч, може змінюватися в межах від 0 до 256 (безліч, не містить елементів, називається порожнім). Саме непостійністю кількості своїх елементів безлічі відрізняються від масивів і записів.
Два безлічі вважаються еквівалентними тоді й тільки тоді, коли всі їхні елементи однакові, причому порядок проходження елементів у множині байдужий. Якщо всі елементи одного безлічі входять також і в інший, говорять про включення першої множини в друге. Порожня множина включається в будь-яке інше.
Опис типу безлічі має вигляд:
<Ім'я типу> = set of <базовий тип>;
Тут <ім'я типу> - правильний ідентифікатор; set, of - зарезервовані слова (безліч, з); <базовий тип> - базовий тип елементів множини, в якості якого може використовуватися будь-який порядковий тип, крім Word, Integer, Longint, Int64.
Для завдання безлічі використовується так званий конструктор безлічі: список специфікацій елементів множини, відокремлених один від одного комами; список обрамляється квадратними дужками. Специфікаціями елементів можуть бути константи або вирази базового типу, а також тип-діапазон того самого базового типу.
Внутрішній устрій безлічі таке, що кожному його елементу ставиться у відповідність один двійковий розряд (один біт); якщо елемент включений у безліч, відповідний розряд має значення 1, у противному випадку - 0. У той же час мінімального одиницею пам'яті є один байт, що містить 8 біт, тому компілятор виділив множинам по одному байту, і в результаті потужність кожного з них стала дорівнює 8 елементам. Максимальна потужність множини - 256 елементів. Для таких множин компілятор виділяє по 16 суміжних байт.
І ще один експеримент: зміните діапазон базового типу на 1 .. 256. Хоча потужність цього типу становить 256 елементів, при спробі компіляції програми компілятор повідомить про помилку: Sets may have at most 256 elements (Множини можуть мати не більше 256 елементів) тому що нумерація елементів безлічі починається з нуля незалежно від оголошеної в програмі нижньої межі . Компілятор дозволяє використовувати в якості базового типу цілочисельний тип-діапазон з мінімальної кордоном 0 і максимальної 255 або будь-який перераховується тип не більш ніж з 256 елементами (максимальна потужність перечисляемого типу - 65536 елементів).
1.3 Рядки
Для обробки текстів у Object Pascal використовуються наступні типи:
короткий рядок shortString або string [n], де n <= 255;
довга рядок string;
широка рядок WideString;
нуль-термінальна рядок pchar.
Спільним для цих типів є те, що кожен рядок трактується як одновимірний масив символів, кількість символів в якому може змінюватися в працюючій програмі: для string [n] довжина рядка змінюється від 0 до n, для string і pchar - від 0 до 2 Гбайт.
У стандартному Паскалі використовуються тільки короткі рядки String [n]. У пам'яті такий рядку виділяється n + i байт, перший байт містить поточну довжину рядка, а самі символи розташовуються, починаючи з 2-го за рахунком байта. Оскільки для довжини рядка в цьому випадку відводиться один байт, максимальна довжина короткого рядка не може перевищувати 255 символів. Для оголошення короткого рядка максимальної довжини призначений стандартний тип ShortString (еквівалент String [255]).
У Windows широко використовуються нуль-термінальні рядки, що представляють собою ланцюжки символів, обмежені символом # о. Максимальна довжина такого рядка лімітується лише доступною пам'яттю і може бути дуже великою.
У 32-розрядних версіях Delphi введений новий тип string, що поєднує в собі зручності обох типів. При роботі з цим типом пам'ять виділяється в міру потреби (динамічно) і обмежена наявною у розпорядженні програми доступною пам'яттю.
1.4 Покажчики й динамічна пам'ять
1.4.1 Динамічна пам'ять
Динамічна пам'ять - це оперативна пам'ять ПК, що надається програмі при її роботі. Динамічне розміщення даних означає використання динамічної пам'яті безпосередньо при роботі програми. На відміну від цього статичне розміщення здійснюється компілятором Object Pascal в процесі компіляції програми. При динамічному розміщенні заздалегідь не відомі ні тип, ні кількість розміщуваних даних.
1.4.2 Покажчики
Оперативна пам'ять ПК являє собою сукупність сейфів для зберігання інформації - байтів, кожен з яких має власний номер. Ці номери називаються адресами, вони дозволяють звертатися, до будь-якого байту пам'яті. Object Pascal надає в розпорядження програміста гнучке засіб керування динамічною пам'яттю - так звані покажчики. Покажчик - це змінна, яка в якості свого значення містить адресу байта пам'яті. За допомогою покажчиків можна розміщувати у динамічній пам'яті будь-якої з відомих у Object Pascal типів даних. Лише деякі з них (Byte, Char, ShortInt, Boolean) займають у внутрішньому поданні один байт, інші - кілька суміжних. Тому насправді покажчик адресує лише перший байт даних.
Як правило, покажчик зв'язується з певним типом даних. Такі покажчики будемо називати типізований. Для оголошення типізованого покажчика використовується значок ^, який поміщається перед відповідним типом.
У Object Pascal можна оголошувати покажчик і не пов'язувати його при цьому з яких-небудь конкретним типом даних. Для цього служить стандартний тип pointer, наприклад:
var
р: Pointer;
Покажчики такого роду будемо називати нетіпізірованньті. Оскільки нетипізовані покажчики не пов'язані з конкретним типом, з їх допомогою зручно динамічно розміщувати дані, структура і тип яких змінюються під час роботи програми.
Як вже говорилося, значеннями покажчиків є адреси змінних в пам'яті, тому слід було б очікувати, що значення одного покажчика можна передавати іншому. Насправді це не зовсім так. У Object Pascal можна передавати значення тільки між показниками, пов'язаними з одним і тим же типом даних.
1.4.3 Виділення та звільнення динамічної пам'яті
Вся динамічна пам'ять в Object Pascal розглядається як суцільний масив байтів, який називається купою.
Пам'ять під будь-яку динамічно розміщувану змінну виділяється процедурою New. Параметром звернення до цієї процедури є типізований покажчик. В результаті звернення покажчик набуває значення, відповідне адресою, починаючи з якого можна розмістити дані. Значення, на яке вказує покажчик, тобто власне дані, розміщені в купі, позначені ^, який ставиться відразу за вказівником. Якщо за покажчиком немає значка ^, то мається на увазі адреса, за якою розміщені дані. Має сенс ще раз замислитися над тільки що сказаним: значенням будь-якого покажчика є адреса, а щоб вказати, що мова йде не про адресу, а про тих даних, які розміщені за цією адресою, за вказівником ставиться ^ (іноді про це говорять як про разименованія покажчика).
Динамічно розміщені дані можна використовувати в будь-якому місці програми, де це припустимо для констант і змінних відповідного типу
Динамічну пам'ять можна не тільки забирати з купи, але і повертати назад. Для цього використовується процедура Dispose. Наприклад, оператори
Dispose (pJ);
Dispose (pR);
повернуть в купу пам'ять, яка раніше була закріплена за покажчиками pJ і pR (див. вище).
Зауважу, що процедура Dispose (pPtr) не змінює значення покажчика pPtr, а лише повертає в купу пам'ять, раніше пов'язану з цим покажчиком. Однак повторне застосування процедури до вільного вказівником призведе до виникнення помилки періоду виконання. Звільнений покажчик програміст може помітити зарезервованим словом nil.
1.5 Псевдоніми типів
Для будь-якого типу можна оголосити скільки завгодно псевдонімів. Наприклад:
type
TMyInteger = Integer;
Надалі псевдонім можна використовувати так само, як і базовий тип:
var
Mylnt: TMyInteger;
begin
Mylnt: = 2 * Round (pi);
end;
Такого роду псевдоніми зазвичай використовуються для підвищення наочності коду програми. Однак у Object Pascal можна оголошувати суворо типізовані псевдоніми додаванням зарезервованого слова type перед ім'ям базового типу:
type
TMyIntegerType = type Integer;
var
MylntVar: TMyIntegerType;
З точки зору компілятора, типізовані псевдоніми сумісні з базовим типом у різного роду виразах, але фактично вони оголошують новий тип даних, тому їх не можна використовувати як формальних параметрів звернення до підпрограм замість базового типу. Якщо, наприклад, оголошена процедура
function MylntFunc (APar: integer): Integer;
begin
end;
то таке звернення до неї
MylntFunc (MylntVar)
буде розцінено компілятором як помилкове.
Строго типізовані псевдоніми змушують компілятор виробляти інформацію про тип для етапу прогону програми (RTTI - Run-Time Type Information). Ця інформація зазвичай використовується середовищем Delphi для забезпечення функціонування різного роду редакторів.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат | 94кб. | скачати

Схожі роботи:
Базові елементи мови типи даних цілочисельні типи даних дані дійсних типів дані типу string
Типи даних З
Типи даних в Turbo Pascal
Типи даних в Object Pascal
Оператори й основні типи даних мови С
Психолого-педагогічна діагностика методологічні основи типи даних
Психолого педагогічна діагностика методологічні основи типи даних
Структуровані типи даних Операції над двомірними масивами
Комп`ютерні дані типи даних обробка та управління
© Усі права захищені
написати до нас
Рейтинг@Mail.ru