Главная » Free Pascal » Определение длины и размеров массивов Free Pascal

0

Под термином "длина одномерного статического массива" обычно понимают объем оперативной памяти в байтах, занятых элементами массива.

var

Для определения этой характеристики обычно прибегают к функции SizeOf:

sa1: array [3..15] of double; begin

writeln(SizeOf(sa1));

Каждый элемент массива sa1 занимает 8 байт. Поскольку в массиве объявлено 13 элементов, то для хранения их значений компилятор отведет 8 13 = 104 байта. Именно эта величина и будет выведена оператором writeln.

Размер одномерного статического массива совпадает с количеством его эле-

ментов.  И для определения этой характеристики обычно прибегают к функции

Length: Length(sa1) = 13

В языке Free Pascal предусмотрены еще две функции — Low и High для опреде- ления минимального и максимального значения индекса одномерного статическо- го массива:

Low(sa1) = 3

High(sa1)= 15

С одномерными динамическими массивами дело обстоит несколько иначе:

var

da1: array of double;

Независимо от того, выделена ли оперативная память под значения элементов динамического массива или еще не выделена, результат функции SizeOf(da1) все- гда равен 4. Фактически это объем памяти, занимаемый указателем da1 на соответ- ствующие данные. Функция Length выдает фактическое значение, равное текуще- му количеству элементов динамического массива, и пока обращения к процедуре SetLength еще не было, эта характеристика равна 0. Применять функцию Low к ди- намическим массивам смысла не имеет, т. к. минимальное значение индекса у та- ких массивов всегда равно 0. До обращения к процедуре SetLength значение функ- ции High(da1) равно –1. В любом случае для одномерного динамического массива имеет место следующее равенство:

High(da1) = Length(da1) – 1

Программа matrix_1 демонстрирует вышесказанное (листинг 6.5).

   Листинг 6 .5 .  Программа  matrix_1                                             

program matrix_1; var

sa1: array [3..15] of double; da1: array of double;

begin

writeln(‘Length(sa1) = ‘,Length(sa1)); writeln(‘SizeOf(sa1) = ‘,SizeOf(sa1)); writeln(‘Low(sa1) = ‘,Low(sa1));

writeln(‘High(sa1)= ‘,High(sa1));

writeln;

writeln(‘Length(da1) = ‘,Length(da1)); writeln(‘SizeOf(da1) = ‘,SizeOf(da1)); writeln(‘Low(da1) = ‘,Low(da1));

writeln(‘High(da1)= ‘,High(da1)); writeln;

SetLength(da1,13); writeln(‘Length(da1) = ‘,Length(da1)); writeln(‘SizeOf(da1) = ‘,SizeOf(da1)); writeln(‘Low(da1) = ‘,Low(da1));

writeln(‘High(da1)= ‘,High(da1)); readln;

end.

Результаты ее работы приведены на рис. 6.1.

Рис. 6.1. Значения стандартных функций для одномерных массивов

С двумерными массивами, как статическими, так и динамическими, ситуация кажется еще запутаннее. Однако и в ней не так уж и сложно разобраться, если ус- воить следующие соглашения языка Паскаль. Во-первых, для двумерного массива q размером n m компилятор заводит n указателей. Первый из них имеет имя q, сов- падающее с именем массива. Он является указателем на начало массива и одно- временно на первую строку массива. Если минимальное значение первого индекса равно k, то указатель q[k] тоже "смотрит" на первую строку массива (т. е. q и q[k] — это два имени одного и того же указателя). Следующий указатель с именем q[k+1] "смотрит" на вторую строку массива и т. д.

Эти   детали   позволят   вам   разобраться  с  результатами  работы  программ

matrix_2 (листинг 6.6 и рис. 6.2) и matrix_3 (листинг 6.7 и рис. 6.3).

Рис. 6.2. Результаты работы программы matrix_2

   Листинг 6 .6 .  Программа  matrix_2                                             

program matrix_2; var

sa2 : array [1..4,2..3] of double; da2 : array of array of double;

begin

writeln(‘Length(sa2) = ‘,Length(sa2)); writeln(‘SizeOf(sa2) = ‘,SizeOf(sa2)); writeln(‘SizeOf(sa2[1]) = ‘,SizeOf(sa2[1]));

writeln(‘Low(sa2) = ‘,Low(sa2));

writeln(‘Low(sa2[1] = ‘,Low(sa2[1]));

writeln(‘High(sa2)= ‘,High(sa2));

writeln(‘High(sa2[1] = ‘,High(sa2[1])); writeln;

writeln(‘Length(da2) = ‘,Length(da2)); writeln(‘SizeOf(da2) = ‘,SizeOf(da2)); writeln(‘Low(da2) = ‘,Low(da2));

writeln(‘Low(da2[1] = ‘,Low(da2[1]));

writeln(‘High(da2)= ‘,High(da2)); writeln;

SetLength(da2,4,2); writeln(‘Length(da2) = ‘,Length(da2));

writeln(‘SizeOf(da2) = ‘,SizeOf(da2)); writeln(‘SizeOf(da2[1]) = ‘,SizeOf(da2[1]));

writeln(‘Low(da2) = ‘,Low(da2));

writeln(‘Low(da2[1] = ‘,Low(da2[1]));

writeln(‘High(da2)= ‘,High(da2));

writeln(‘High(da2[1] = ‘,High(da2[1])); readln;

end.

   Листинг 6.7. Программа  matrix_3                                             

program matrix_3; var

a: array [1..3,1..2] of integer = ((1,2),

(3,4),

(5,6));

p: ^integer; begin

p:=@a;

writeln(‘a   = ‘,p^,’ a+1   = ‘,p^+1); p:=@(a[1]);

writeln(‘a[1] = ‘,p^,’ a[1]+1 = ‘,p^+1); p:=@(a[2]);

writeln(‘a[2] = ‘,p^,’ a[2]+1 = ‘,p^+1); p:=@(a[3]);

writeln(‘a[3] = ‘,p^,’ a[3]+1 = ‘,p^+1); readln;

end.

Рис. 6.3. Результаты работы программы matrix_3

Инициализация глобальных статических массивов

Объявление глобальных статических массивов может быть совмещено с при- своением их элементам начальных значений.

var

Для описаний следующего вида используется термин "инициализация":

sa1: array [1..10] of integer = (1,2,3,4);

sa2: array [1..2, 1..3] of integer = ((1,2,3),

(4,5,6));

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии