|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Процедура SetLength
procedure SetLength(var <Имя массива>; <Число элементов>: integer); Под одномерный массив <Имя массива> выделяется место в памяти, объем которого задает <Число элементов>. Диапазон индексов: 0.. <Число элементов> - 1. Процедура Finalize procedure Finalize(var <Имя массива>); Память из-под переменной <Имя массива> высвобождается. Альтернатива: <Имя массива> := Nil; Процедуру FreeMem применять не следует.
Пример 1. program Project1; {$APPTYPE CONSOLE} Uses SysUtils; Var mA: array of char; Begin SetLength(mA, 3); mA[2]:= 's'; writeln(mA[2]); readln; end. Пример 2.
Var mA, mB: array of integer; mC, mD: array [0..10] of integer;
Begin SetLength(mA, 11); mA[0]:= 1; mB:= mA; // Указатель mB стал указывать туда же, куда и указатель mA. mB[0]:= 2;
mC[0]:= 1; mD:= mC; // В массив mD скопировано всё содержимое массива mC. end.
Переменная mB есть указатель на тот же динамический массив, что и переменная mA. Значение mA[0] есть 2. Оператор mB[11]:= 2; не приводит к увеличению числа элементов массива до 12. Ответственность за выход за границы массива (и за всю тяжесть последствий) лежит на программисте.
Пример 3. Var mA, mB: array of integer; Begin SetLength(mA, 1); SetLength(mB, 1); mA[0]:= 2; mB[0]:= 2; writeln(mA = mB); // False. Содержимое массивов одинаково, // а вот указатели на массивы НЕ равны. writeln(mA[0] = mB[0]); // True. Эти элементы массивов равны. end; Пример 4.
Var i, n: integer; mA: array of integer; Begin n:=7; SetLength(mA, n); for i:=0 to n-1 do mA[i]:=i;
for i:=0 to n-1 do write(mA[i]:3); // 0 1 2 3 4 5 6
n:=4; SetLength(mA, n); for i:=0 to n-1 do write(mA[i]:3); // 0 1 2 3 // Массив «подрезан» до 4 элементов. Эти элементы сохранили свои значения.
n:=8; SetLength(mA, n); for i:=0 to n-1 do write(mA[i]:3); // 0 1 2 3 0 0 0 0 // Массив расширен до 8 элементов. // Но нет гарантии, что новым элементам придается значение 0. // Эти значения, вообще говоря, непредсказуемы.
readln;
writeln(Length(mA)); // 8 writeln(High(mA)); // 7 writeln(Low(mA)); // 0
Finalize(mA);
writeln(Length(mA)); // 0 writeln(High(mA)); // -1 writeln(Low(mA)); // 0
readln; end. Пример 5. Двумерные массивы (точнее, массивы массивов)
program Project1; {$APPTYPE CONSOLE}
Uses SysUtils;
Type MyRowType = array of integer; // MyRowType – указатель на массив элементов типа integer.
Var i, j: integer; mA: array of MyRowType; // mA – указатель на массив указателей (на массив элементов типа integer) Begin SetLength(mA, 3); // Размещен в памяти массив указателей на строки матрицы. // Сами строки пока в памяти не размещены. for i:= 0 to 2 do SetLength(mA[i], 4); // Размещены в памяти строки матрицы. Длина каждой строки – 4 числа.
for i:= 0 to 2 do for j:= 0 to 3 do mA[i][j]:= 10 * (i + 1) + (j + 1); // Допускается обращение mA[i, j]
for i:= 0 to 2 do Begin for j:= 0 to 3 do write(mA[i][j]:5); writeln; end;
for i:= 0 to 2 do Finalize(mA[i]); // Память освобождена из-под строк матрицы. // Указатели на строки пока доступны.
Finalize(mA);
writeln;
end.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.) |