Опубликован: 01.11.2004 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 9:

Структурированные типы данных языка Object Pascal

< Лекция 8 || Лекция 9: 123 || Лекция 10 >

Массивы

В языке Object Pascal можно создавать одномерные и многомерные массивы. Все элементы массива имеют одинаковый тип.

Одномерный массив языка Object Pascal имеет следующее формальное описание:

Идентификатор:
array [нач_индекс..кон_индекс]
   of тип_массива;

Например:

type 
  RealArr = array[1..100] of Real;
var
  int1: array[1..20] of Integer;
  int2: array[1..20] of Integer; 
  int3, int4: array[1..10] of Integer;
  real1: array[1..10] of Real;
begin
Int1 := Int2;
end.

Массивы могут объявляться как константы.

Например:

type 
  TCube = array[0..1, 0..1, 0..1]
    of Integer;
const 
  cub1: TCube = (((0, 1), (2, 3)),
    ((4, 5), (6,7)));
{ Элементы массива cub1 будут
  содержать следующие значения:
     	cub1 [0,0,0] = 0
	cub1 [0,0,1] = 1
	cub1 [0,1,0] = 2 и т.д.
 }

Массив символов объявляется как массив переменных типа Char. Символьный массив может быть доступен через указатель на массив типа PChar.

Строки можно реализовывать как символьные массивы, ограниченные 0-символом ( #0 ).

Например:

const 
  TempString: array[0..8] of Char =
    'Строка'#0; 
var 
  P: PChar;    {Указатель на строку}
begin
  P := 'Строка';
  P := @TempString;
  {Переменная P указывает на
   значение 'Строка'} 
end.

Массив символов типа Char и значение типа PChar эквивалентны.

Например:

var
  MyArray: array[0..5] of Char;
  MyPointer: PChar;
begin
  MyArray := 'array';
  MyPointer := MyArray;
  MyProc(MyArray);
  {Эквивалентно вызову
   MyProc(MyPointer);}
  end.

Многомерный массив имеет следующее формальное описание:

array[диапазон_первого_индекса, ..., 
   диапазон_n_индекса] of базовый_тип;
array[диапазон] of array[диапазон]
   of array[диапазон] of тип;

Так, объявление

type MyMassiv = array[1..10]
   of array[1..70] of Integer;

эквивалентно объявлению

type MyMassiv = array[1..10, 1..70]
   of Integer;

Например:

type MyAr = array[1..10, 1..50]
   of Real;
begin
MyAr[1,49]:= 49;
end.

По принципу выделения памяти под массив массивы языка Object Pascal делятся на статические и динамические.

Память под статический массив выделяется при его создании.

Динамический массив не имеет фиксированного размера или длины.

При объявлении динамического массива память под него не выделяется. Выделение памяти происходит каждый раз при присвоении значения массиву или при вызове процедуры SetLength.

Создание динамического массива имеет следующее формальное описание:

array of тип_элементов_массива;

Например:

{Объявление динамического массива}
var MyAr: array of Integer;
{Определение количества элементов
 в динамическом массиве:}
SetLength(MyAr, 10);

Элементы динамического массива всегда индексируются с 0. Переменная типа динамического массива является указателем, и к ней применимы операции над указателями. Для освобождения памяти, занимаемой динамическим массивом, можно присвоить значение nil переменной, ссылающейся на массив. Количество элементов динамического массива определяется процедурой SetLength. Функция Length возвращает количество элементов в динамическом массиве.

При сравнении двух переменных типа динамического массива выполняется сравнение их ссылок, а не значений их элементов. Например:

var  
  A, B: array of Integer;
begin 
  SetLength(A, 1); SetLength(B, 1); 
A[0] := 2; B[0] := 2;
{A[0] = B[0] вернет значение True} 
{A = B вернет значение False}
end.

Для усечения динамического массива можно использовать функцию Copy.

Например:

var  
  A: array of Integer;
begin
  SetLength(A, 50);
  {Оставляет 10 элементов массива A}
  A := Copy(A, 0, 10);
end.

Если при объявлении функции или процедуры формальный параметр определяется как array of тип_массива, то эта функция или процедура может получить в качестве фактического параметра любой динамический или статический массив указанного типа вне зависимости от его размера и индексации его элементов.

< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);