Масиви (array) і робота з ними

Масив - це регулярна структура даних, оголошується спеціальною конструкцією мови

Array [діапазони індексів] of ТіпКомпонентов

Найбільш часто масив використовують для зберігання значень векторів, наприклад:

V. Array [1..3] of Real;

оголошуючи тим самим структуру з трьох значень типу Real, проіндексованих заданим діапазоном цілих чисел (V [1], V [2] і V [3]). Якщо індексація компонентів (елементів) масиву задається числовим діапазоном, як у наведеному прикладі, то треба дотримуватися лише дві вимоги: по-перше, діапазон не повинен належати типу LongInt, тобто він зобов'язаний «вміститися» максимум в типі Word, a по-друге, твір кількості компонентів масиву, що задається діапазоном індексів, на розмір компонента в байтах, не може перевищувати 65520 байт (майже 64K). Остання вимога є загальним не тільки для всіх масивів, а й для інших структур даних. Таким чином, можуть бути описані масиви

Це дуже зручно, так як дозволяє не піклуватися про приведення індексів до діапазону 1..N, як, наприклад, доводиться надходити при роботі з Фортраном або деякими версіями Бейсика.

У загальному випадку ніщо не зобов'язує повідомляти діапазон індексів масиву числами. Як індексів можна використовувати будь-які перелічуваних типи, як вбудовані, так і вводяться. Індекси можуть задаватися як і раніше діапазоном, а якщо діапазон відповідає всьому типу, то можна замість нього просто записати ім'я цього перечислимого типу:

ComplectType = Array [MonthType] of Word;

Alpha. Array [ 'A' .. 'z'] of Char;

Switch. Array [Boolean] of Byte; <два элемента>

Розглянуті масиви - одномірні, тобто такі, у яких компоненти - скаляри. Дозволено оголошувати масиви масивів:

VectorType = Array [1..3] of Real; <вектор>

MatrixType = Array [1..10] of VectorType; <матрица10x3>

Опис типу двовимірного масиву MatrixType могло бути записано по-іншому:

MatrixType = Array [1..10] of Array [1..3] of Real;

MatrixType = Array [1..10, 1..3] of Real;

Останній варіант найбільш наочно представляє опис матриці. Кількість вимірювань формально не обмежена, але сума розмірів всіх компонентів масиву не повинна перевищувати 64K. Кожен вимір абсолютно не залежить від інших, і можна оголошувати масиви з різними індексами:

M. Array [-10..0, 'A' .. 'C', Boolean] of Byte;

Array [Boolean] of Byte;

Цікаво, що тип елемента масиву M залежить від числа зазначених при ньому індексів. так,

M [0] - масив-матриця типу Array [ 'A' .. 'C', Boolean] of Byte,

М [0, 'B'] - вектор типу Array [Boolean] of Byte,

M [0, 'B', False] - значення типу Byte.

ArrayBType = Array [Boolean] of Byte;

ArrayCType = Array [ 'A' .. 'C'] of ArrayBType;

ArrayMType = Array [-10..0] of ArrayCType;

і лише після цього будуть дозволені присвоювання виду

Турбо Паскаль дозволяє записувати індекси не через кому, а як би ізольовано:

M [-3, 'B', True] еквівалентно M [-3] [ 'B'] [True]

Компонентом масиву може бути не тільки інший масив, а й запис, і покажчик, і будь-якої іншої тип. Якщо R - масив записів (RECORD), то доступ до поля кожного запису проводиться після вказівки індексу:

Турбо Паскаль має спеціальний режим компіляції, що задається ключем $ R. Якщо вся програма або фрагмент її компілювався в режимі, то при зверненні до елементів масивів буде перевірятися приналежність значення індексу оголошеному діапазону, і в разі порушення кордонів діапазону програма перерветься з видачею помилки 201 (Range check Error). Навпаки, в режимі ніяких перевірок не проводиться, і некоректне значення індексу витягне «як ні в чому не бувало» якесь значення - але, на жаль, не належить даному масиву. Зазвичай програму налагоджують в режимах $ R +, а експлуатують при режимі $ R-. Це трохи зменшує розмір ЕХЕ-файла і час його виконання.

До двох сумісним масивів A і B може бути застосована тільки операція присвоювання:

яка копіює поелементно масив B в масив A.

Всілякі математичні дії над масивами (матрицями) необхідно реалізовувати самим або використовувати спеціальні бібліотеки (наприклад, Turbo Numeric Toolbox).

Для сумісності з іншими версіями Паскаля Турбо Паскаль допускає використання складених символів (. І.) Замість квадратних дужок:

M [0] еквівалентно M (. 0.)

Крім того, ключове слово Array в описах масивів може передувати зарезервованим словом PACKED (упакований, стислий):

X. PACKED Array [1..100] of Real;

На завершення відзначимо одну особливість компілятора Турбо Паскаля. Для багатьох мов програмування справедливо правило: робота з елементом масиву займає більше часу, ніж зі скалярної змінної (треба обчислювати місцеположення елемента в пам'яті). Якщо індекси при зверненні до елементу задаються змінними або виразами, то це вірно і для Турбо Паскаля. Але якщо індекс елемента задається константою, то швидкість звернення до нього буде максимальною, тому що компілятор в цьому випадку вирахує розташування елемента ще на етапі компіляції програми.

Схожі статті