Відкриті масиви - студопедія
Статичні (стандартні) масиви
Оголошення вектора або одновимірного масиву має наступний загальний вид (тут і надалі використовуємо рекомендацію, згідно з якою структурований призначений для користувача тип оголошується окремо від оголошення змінної цього типу):
Тут оголошені два однакових масиву A і B, все елементи якого мають тип Integer, і один масив arrStudent, з базовим типом TarrStudent, оголошеним в підрозділі 5.2. Кількість елементів в кожному масиві A і B дорівнює 13, масив arrStudent містить 101 елемент. Масив символів S - це фактично рядок, з ним можна звертатися як з рядком.
У розглянутих прикладах індекси були задані обмеженим цілим типом. Так найчастіше і буває, але це не обов'язково. Для індексації масиву можуть використовуватися будь-які обмежені або перелічуваних типи. Можна визначити масив arrColor наступним чином:
Color = (Red, Green, Blue);
Тепер можна звернутися, наприклад, до другого елементу вектора arrColor як arrColor [Green].
Чи не забороняється ставити індекс символами.
Фізична структура вектора представляється в ма-шинної пам'яті послідовністю однакових по довжині ділянок пам'яті (слотів), кожен з кото-яких призначений для зберігання одного елемента вектора. Зазвичай елементи вектора розташовуються в пам'яті в по-рядку зростання адрес відповідних їм слотів. Дескриптор вектора може містити такі поля, як ім'я вектора, адреса в пам'яті його початково-го елемента (т. Е. Першого слота), нижня і верхня межі-ці індексу, тип елемента і розмір слота. Фізична структура вектора A, оголошеного вище, показана на малюнку 5.1.

Малюнок 5.1 - Приклад фізичної структури вектора з базовим типом Integer
При доступек будь-якому елементуімя вектора і поточний індекс елемента перетворюються в фізичну адресу слота, в якому розташовується цей елемент. Як видно з рісунка5.1, ло-гическая і фізична структури вектора збігаються, і те й інше - лінійні послідовності елементів. Якщо в логічній структурі при переході від одного елемента до іншого послідовному елементу індекс змінюється на одиницю, то при переході між послідовними елементами у фізичній структурі, адреса змінюється на величину, яка дорівнює розміру слота базового типу.
5.2.2 Багатовимірні статичні масиви
Як було зазначено вище, вектор - це одновимірний масив. В усіх мовах програмування можна оголошувати і багатовимірні масиви, т. Е. Масиви, елементами яких є масиви. Наприклад, двовимірний масив можна оголосити таким чином:
Те ж саме можна оголосити більш компактно:
Доступ до значень елементів багатовимірного масиву забезпечується за допомогою імені змінної типу «масив» і індексів, що перераховуються через кому, наприклад, X [3, 0]. Кількість вказуються індексів має дорівнювати розмірності масиву: для доступу до елементу М-мірного масиву необхідно вказати М індексів.
Всі елементи масиву мають один і той же тип. На відміну від вектора для масиву загального вигляду перетворення логічної структури в фізичну має більш складний вид. Це перетворення виконується шляхом лінеаризації, в ході якої М-мірна логічна структура масиву перетворюється в одновимірну фізич-ську структуру, що представляє собою лінійно уперед-ченную послідовність слотів. Таке перетворення реалізується за допомогою відповідної функції впорядкування, аргументом якої є упорядкований набір індекс інфляції-сов елемента, а значенням - адреса відповідаю-ного слота. Наприклад, якщо послідовність однотипних елементів трактується як двовимірний масив, і нижні межі індексів i і j рівні 0, то адреса (i, j) -елементом матриці обчислюється за допомогою наступної функції впорядкування:
Адреса (i, j) = база + Nrow * SizeOf (Element) * i + j,
де база - адреса початкового елемента масиву,
Nrow - кількість елементів в рядку,
SizeOf (Element) - розмір слота елемента в байтах,
Хоча фізична структура М-мірного масиву при лінійному впорядкування його елементів в пам'яті збігається з фізичною структурою вектора, дескриптор масиву відрізняється від дескриптора вектора. Зокрема, в полях дескриптора масиву може міститися наступна ін-формація:
- поле типу структури;
- поле імені масиву, наприклад, Matr;
- поле, що містить розмірність масиву;
- адреса масиву в пам'яті (база);
- поля, що містять пари граничних значень індекс інфляції-сов, число цих полів одно розмірності масиву;
- поля, що містять спеціальні індексні множити-ли (їх число дорівнює розмірності масиву), необхід-мі для використання у функції впорядкування;
- поле базового типу масиву;
- поле, що містить розмір слота для елемента.
Для масивів в Delphi визначена операція присвоювання. Якщо два масиву A і B типу TarrVect визначені, за допомогою нотацій, наведених в п. 5.2.1, то в результаті виконання оператора
значення елементів масиву У скопійовано в елементи масиву А.
Але якщо оголосити масиви як
то при спробі привласнення A: = B компілятор Delphi видасть повідомлення про помилку несумісності типів. Справа в тому, що компілятор вважає, що змінні мають один і той же тип тільки в разі, якщо вони оголошені в одному і тому ж списку або вони явно визначені через деякий пойменований тип. Це ще один аргумент на користь використання імен типів в описах структурованих змінних.
5.2.3 Властивості статичних масивів
Статичні масиви характеризуються такими властивостями:
- сталість структури протягом усього часу її існування,
- суміжність елементів і безперервність області па-мяти, що відводиться відразу для всіх елементів структури.
- простота і сталість відносин між елемента-ми структури, що дозволяють виключити інформацію про ці відносини з області пам'яті, виділеної для еле-ментів структури, і зберігати її в компактній формі в де-скрипторіях.
У списку параметрів, що поміщається в заголовках функцій і процедур, допускається вказувати масиви. Якщо розмір сприйманого масиву фіксований, то в списку параметрів тип такого параметра задається тільки за допомогою ідентифікатора типу. Підпрограми Object Pascal можуть сприймати також масиви, розмір яких невідомий. В цьому випадку в заголовку підпрограми після запису імені параметра-масиву вказується слово array, а потім базовий тип, а опис індексів не наводиться. наприклад,
Такі масиви (як D і T) називаються відкритими масивами.
При такому визначенні масивів D і T той масив, який передається в процедуру InverArray першим в якості фактичного параметра, буде копіюватися в стек, і з цією копією - масивом D - буде працювати процедура. Другий відкритий масив (масив Т) визначено як Var. Цей масив передається «по посиланню», т. Е. Він не копіюється в стек, і процедура буде працювати з тим масивом, який був переданий як фактичний параметр при виклику InverArray.
Масив, переданий як відкритий, сприймається в тілі процедури або функції як масив з цілими індексами, що починаються з нуля. При цьому не має значення, як був оголошений діапазон для індексу в масиві, переданому в процедуру у вигляді фактичного параметра.