|
|
|||||||||||||||||||||||||||||
|
Изменение размеров массивовИсточник: codingrus Kest
Delphi до версии 4.0 (Хотя, начиная с четвертой версии, Delphi поддерживает динамические массивы, вставка и удале- type Изменение размеров массива - мощная, но несколько опасная методика. Ра- ботая с массивом, Delphi не определяет его размер. В программе SizeArr Delphi воспринимает массив как указатель, содержащий миллион ячеек. Если программа фактически выделила память только для 10 элементов, Delphi не определит по- пытку доступа к 1 00-му элементу как ошибку. Вместо того чтобы выдать при компи- ляции сообщение о том, что индекс массива вышел за пределы, во время выполне- ния программа будет пытаться сделать запись в 100-ю позицию массива. В лучшем случае обращение к этой ячейке памяти просто остановит работу программы. В худ- шем это вызовет неявный сбой, который будет очень сложно найти. Подобная проблема возникает, если программа использует неверно заданную нижнюю границу массива. Предположим, что тип массива определен так, как опи- сано в следующем фрагменте кода: TIntArray = array [1.. 1000000] of Integer;
Подобную ошибку допустить очень просто. Неприятности начнутся, когда программа попробует обратиться к элементу массива в нулевой позиции. При объявлении в процедуре нового массива, такого как PIntArray, его гра- ницы не указываются. Необходимо помнить, какой тип массива вы определили да- лее в программе. Программа освобождает выделенную для обычного массива память, когда он выходит из области видимости. Например, массив, объявленный в пределах про- цедуры, автоматически освобождается, когда процедура заканчивается. С другой стороны, память, выделенная с помощью процедуры GetMem, остает- ся таковой до тех пор, пока не освободится с помощью процедуры FreeMem. Пока программа не будет завершена, доступа к памяти не будет. При этом неоднократ- ный вызов процедуры занимает много системной памяти. Наконец, существенную проблему создает обращение к памяти, освобожден- ной процедурой FreeMem. Если программа освобождает память массива и затем обращается к этому массиву, то следствием может быть либо ее остановка, либо неявный сбой. Можно сократить вероятность возникновения такого эффекта, сбрасывая указатель массива на нуль после освобождения памяти. В этом случае вместо неявного сбоя попытка обращения к массиву вызовет ошибку нарушения доступа. Несмотря на подстерегающие опасности изменение размеров массива - очень мощная методика. При работе со списками, меняющими свой размер, она позволя- ет достигать очень высокой производительности. Delphi, начиная с версии 4.0, поддерживает встроенный механизм изменяемых массивов. По своему синтаксису работа со встроенными динамическими массива- ми очень похожа на работу с обычными массивами языка Pascal. Сначала следует объявить переменную массива, не указывая при этом его гра- ниц. Изменение его размера производится с помощью процедуры SetLength. Так как заранее длина массива не известна, потребуются еще три функции: Length, возвращающая количество элементов массива, Low, возвращающая индекс перво- го элемента (обычно 0) и High, возвращающая индекс последнего элемента.
// Изменение размера массива. Ссылки по теме
|
|