Иногда в разработке на Delphi возникает необходимость не только изменить размер динамического массива, но и заполнить его нулями. В стандартной библиотеке языка Object Pascal есть процедура SetLength, которая позволяет изменить размер массива, но она не гарантирует, что новый участок памяти будет инициализирован нулями. В этой статье мы рассмотрим, как создать собственную процедуру, которая будет выполнять обе задачи.
Проблема
Процедура, которая бы изменяла размер массива и заполняла его нулями, могла бы выглядеть следующим образом:
procedure SetLengthAndZero(VAR X; NewSize: Integer);
begin
SetLength(X, NewSize);
if NewSize > 0 then
FillChar(X[0], Length(X) * SizeOf(X[0]), 0);
end;
Однако данный код не будет компилироваться. Это связано с тем, что после выполнения SetLength содержимое памяти может быть неопределенным, как указано в документации по Delphi 7.
Решение
Согласно документации Embarcadero, процедура SetLength для динамического массива перераспределяет память, на которую ссылается переменная, до заданной длины. Существующие элементы массива сохраняются, а новый участок памяти инициализируется нулями или nil. Это означает, что для очистки и изменения размера динамического массива достаточно использовать только SetLength.
Если требуется полностью очистить динамический массив, не сохраняя существующие элементы, достаточно вызвать SetLength с NewLength = 0, а затем снова с нужным размером.
Type
TDynArrayTool = record
class procedure ClearAndSetLength<T>(var arr : TArray<T>; newLen : Integer); static;
end;
class procedure TDynArrayTool.ClearAndSetLength<T>(var arr: TArray<T>; newLen: Integer);
begin
SetLength(arr, 0);
SetLength(arr, newLen);
end;
Пример использования
var
MyArray: array of Integer;
begin
TDynArrayTool.ClearAndSetLength<Integer>(MyArray, 10); // Создаем массив из 10 элементов, заполненных нулями
end;
Заключение
Используя SetLength в сочетании с инициализацией нулевым размером, можно эффективно очистить динамический массив и изменить его размер, не сохраняя старые значения. Это решение является универсальным и подходит для всех версий Delphi, начиная с Delphi 5, где новая память, выделенная SetLength, уже инициализируется нулями.
Создание процедуры в Delphi для очистки и изменения размера динамических массивов с инициализацией их нулями.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.