Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание Процедуры для Очистки и Изменения Размера Динамических Массивов в Delphi

Delphi , Синтаксис , Память и Указатели

Иногда в разработке на 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:21:59/0.0032320022583008/0