×
Traktatov.net » Описание языка PascalABC.NET » Читать онлайн
Страница 23 из 252 Настройки
Вывод динамического массива

Процедура write выводит динамический массив, заключая элементы в квадратные скобки и разделяя их запятыми:

var a := Arr(1,3,5,7,9);

writeln(a); // [1,3,5,7,9]

n-мерный динамический массив выводится так, что каждая размерность заключается в квадратные скобки:.

var m := new integer[3,3] ((1,2,3),(4,5,6),(7,8,9));

writeln(m); // [[1,2,3],[4,5,6],[7,8,9]]

Динамический массив можно выводить также методом расширения Print или Println:

a.Println;

При этом элементы по умолчанию разделяются пробелами, но можно это изменить, задав параметр Print, являющийся разделителем элементов. Например:

a.Print(NewLine);

выводит каждый элемент на отдельной строке.

Массивы массивов

Если объявлен массив массивов

var с: array of array of integer;

то его инициализацию можно провести только с помощью SetLength:

SetLength(с,5);

for i := 0 to 4 do

SetLength(c[i],3);

Для инициализации такого массива с помощью new следует ввести имя типа для array of integer:

type IntArray = array of integer;

var с: array of IntArray;

...

c := new IntArray[5];

for i := 0 to 4 do

c[i] := new integer[3];

Инициализацию массива массивов можно также проводить в сокращенной форме:

var

c: arrayofarrayof integer := ((1,2,3),(4,5),(6,7,8));

Присваивание динамических массивов

Динамические массивы одного типа можно присваивать друг другу, при этом обе переменные-ссылки будут указывать на одну память:

var a1: arrayof integer;

var a2: arrayof integer;

a1 := a2;

Следует обратить внимание, что для динамических массивов принята структурная эквивалентность типов: можно присваивать друг другу и передавать в качестве параметров подпрограмм динамические массивы, совпадающие по структуре.

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

a1 := Copy(a2);

Передача динамического массива в подпрограмму

Динамический массив обычно передается в подпрограмму по значению, т.к. сама переменная уже является ссылкой:

procedure Squares(a: array of integer);

begin

for var i:=0 to a.Length-1 do

a[i] := Sqr(a[i]);

end;

begin

var a := Arr(1,3,5,7,9);

Squares(a);

end.

Динамический массив передается по ссылке только в одном случае: если он создается или пересоздается внутри подпрограммы. В частности, это необходимо делать если для динамического масива внутри подпрограммы вызывается SetLength:

procedure Add(var a: array of integer; x: integer);

begin

SetLength(a,a.Length+1);

a[a.Length-1] := x;

end;

begin

var a := Arr(1,3,5,7,9);

Add(a,666);

writeln(a);

end.

Стандартные процедуры и функции для работы с динамическими массивами

Методы расширения для динамических массивов

Указатели

Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).

Тип указателя на тип T имеет форму ^T, например:

type pinteger = ^integer;

var p: ^record r,i: real end;

Бестиповой указатель описывается с помощью слова pointer.