Setlength в паскале что это

от admin

SetLength

SetLength for strings устанавливает длину строки S в Len. S может быть ansistring, короткой строкой или widestring. Для коротких струн Len может быть максимально 255. Для AnsiStrings он может иметь любое значение. Для AnsiString строк SetLengthmust использоваться для установки длины строки.

В случае динамического массива A SetLength задает количество элементов. Элементы нумеруются от индекса 0, поэтому счет идет от 0 до Len-1. Если указан ноль, массив очищается и удаляется из памяти.

В случае, если длина установлена на меньшую длину, чем текущая, существующие элементы (символы в случае строки) сохраняются.

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

Обратите внимание, что SetLength управляется принципом копирования при записи для строк и динамических массивов: счетчик ссылок после вызова SetLength будет равен 1 (за исключением случаев, когда длина равна нулю, тогда массив удаляется из памяти).

Для многомерных массивов SetLength можно использовать для указания всех измерений сразу:

Это создаст динамический массив из 10 элементов, где каждый элемент сам по себе является динамическим массивом из 20 элементов. SetLength, конечно, всегда будет создавать «прямоугольные» массивы: все элементы будут иметь одинаковый размер.

SetLength

SetLength for strings sets the length of the string S to Len . S can be an ansistring, a short string or a widestring. For ShortStrings , Len can maximally be 255. For AnsiStrings it can have any value. For AnsiString strings, SetLength must be used to set the length of the string.

In the case of a dynamic array A , SetLength sets the number of elements. The elements are numbered from index 0, so the count runs from 0 to Len-1 . If Zero is specified, the array is cleared and removed from memory.

In case the length is set to a smaller length than the current one, the elements 0-(Len-1) (or characters 1-Len in case of a string) are kept. The elements that fall outside the new length are finalized if the array element is a managed type.

In case the length is set to a larger length than the current one, the new elements are zeroed out for a dynamic array. For a string, the string is zero-terminated at the correct length.

Note that SetLength is governed by the Copy-On-Write principle for strings and dynamic arrays: the reference count after a call to SetLength will be 1 (except when the length is zero, then the array is removed from memory).

For multi-dimensional arrays, SetLength can be used to specify all dimensions at once:

This will create a dynamic array with 10 elements, where each element in itself is a dynamic array of 20 elements. SetLength will of course always create «rectangular» arrays: all elements will have the same size.

Setlength в паскале что это

When changing the size of a string StringToChange, the new size NewLength may be smaller, the same or larger than the existing string. In all cases, the size is in characters, and a new string is created regardless.

If the string is shorter, it gets truncated. If longer, the extra characters are not initialised. This can create odd effects — see the first example.

A dynamic array is one that is not declared with a fixed size. Such a declaration creates a pointer only. Even a multi-dimensional dynamic array starts as a single, unitialised pointer. A multidimensional array is really just a single dimensional array that has arrays as elements.

SetLength sets the length of the dimensions Dim1Length, Dim2Length . of the ArrayToChange. This may be performed multiple times — not just on an unitialised array. Subsequent calls will lose data, or add extra space. This extra space is only initialised if it contains strings, interfaces, or Variants.

Динамические массивы

Тип динамического массива конструируется следующим образом:

array of тип элементов (одномерный массив)
array [,] of тип элементов (двумерный массив)
и т.д.

Переменная типа динамический массив представляет собой ссылку. Поэтому динамический массив нуждается в инициализации (выделении памяти под элементы).

Выделение памяти под динамический массив

Для выделения памяти под динамический массив используется два способа. Первый способ использует операцию new в стиле вызова конструктора класса:

var
a: array of integer;
b: array [,] of real;
begin
a := new integer[5];
b := new real[4,3];
end.

Данный способ хорош тем, что позволяет совместить описание массива и выделение под него памяти:

var
a: array of integer := new integer[5];
b: array [,] of real := new real[4,3];

Описание типа можно при этом опускать — тип автовыводится:

Читать:
Switch usb что это

Второй способ выделения памяти под динамический массив использует стандартную процедуру SetLength :

Элементы массива при этом заполняются значениями по умолчанию.

Процедура SetLength обладает тем преимуществом, что при ее повторном вызове старое содержимое массива сохраняется.

Инициализация динамического массива

Можно инициализировать динамический массив при выделении под него память операцией new:

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

var
a: array of integer := (1,2,3);
b: array [,] of real := ((1,2,3),(4,5,6),(7,8,9),(0,1,2));
c: array of array of integer := ((1,2,3),(4,5),(6,7,8));

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

Инициализация одномерного массива проще всего осуществляется стандартными функциями Seq. которые выделяют память нужного размера и заполняют массив указанными значениями:

var a := Arr(1,3,5,7,8); // array of integer
var s := Arr(‘Иванов’,’Петров’,’Сидоров’); // array of string
var b := ArrFill(777,5); // b = [777,777,777,777,777]
var r := ArrRandom(10); // заполнение 10 случайными целыми в диапазоне от 0 до 99

В таком же стиле можно инициализировать массивы массивов:

var a := Arr(Arr(1,3,5),Arr(7,8),Arr(5,6)); // array of array of integer

Длина динамического массива

Динамический массив помнит свою длину (n-мерный динамический массив помнит длину по каждой размерности). Длина массива (количество элементов в нем) возвращается стандартной функцией Length или свойством Length :

Для многомерных массивов длина по каждой размерности возвращается стандартной функцией Length с двумя параметрами или методом GetLength(i) :

Ввод динамического массива

После выделения памяти ввод динамического массива можно осуществлять традиционно в цикле:

Ввод динамического массива можно осуществлять с помощью стандартной функции ReadSeqInteger:

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

Вывод динамического массива

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

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

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

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

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

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

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

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: array of array of integer := ((1,2,3),(4,5),(6,7,8));

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

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

var a1: array of integer;
var a2: array of integer;
a1 := a2;

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

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

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

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

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.

Похожие статьи