October 23

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

Работа с массивами в PascalABC.NET имеет свои особенности, особенно если речь идёт о динамических массивах. В этой новости разберём, как правильно присваивать, копировать и сравнивать такие массивы.

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

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

Пример:
var a := new integer[5]; // Создаём массив
var b := a; // b ссылается на тот же массив,что и a
b[0] := 10; // Теперь и a[0], и b[0] равны 10

Чтобы создать независимую копию массива, следует использовать встроенную функцию Copy(a).

Пример:
var a := new integer[5]; // Создаём массив
var b := Copy(a);        // b — это копия массива a
b[0] := 10;  // Изменение b не затрагивает a

🔹 Сравнение массивов

✦ Прямое сравнение массивов через оператор = проверяет ссылки, а не содержимое массивов. Даже если два массива содержат одинаковые элементы, они будут считаться неравными, если ссылаются на разные объекты в памяти.

Пример
var a := new integer[5];
var b := new integer[5];
if a = b then // это сравнение вернёт False
  Println('Массивы равны')
else Println('Массивы не равны');

✦ Для корректного сравнения содержимого массивов в PascalABC.NET нужно использовать метод ArrEqual, который проверяет, равны ли все элементы двух массивов.

Пример:
var a := new integer[5];
var b := new integer[5];
if a.ArrEqual(b) then  // Проверяет равенство всех элементов массива
  Println('Массивы равны')
else Println('Массивы не равны');

🔹 Итоги:

✦ Для копирования массива используйте функцию Copy(a), чтобы избежать ссылочного присваивания.
✦ Для сравнения содержимого массивов используйте метод ArrEqual.