Відкриті масиви - студопедія

Статичні (стандартні) масиви

Оголошення вектора або одновимірного масиву має наступний загальний вид (тут і надалі використовуємо рекомендацію, згідно з якою структурований призначений для користувача тип оголошується окремо від оголошення змінної цього типу):

Тут оголошені два однакових масиву 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.

Масив, переданий як відкритий, сприймається в тілі процедури або функції як масив з цілими індексами, що починаються з нуля. При цьому не має значення, як був оголошений діапазон для індексу в масиві, переданому в процедуру у вигляді фактичного параметра.