Масиви CLR

Масиви CLR відрізняються від масивів рідного C++. Пам'ять для масиву CLR виділяється в керованій купі, але це ще не все. Масиви CLR мають убудовану функціональність, який немає в масивів рідного C++. Тип змінної масиву специфiцируеться ключовим словом array. При цьому також необхідно вказати тип елементів масиву між кутовими дужками, що випливають за ключовим словом array, тому загальна форма змінної, що посилається на одномірний масив аггау<тип_елемента>^. Оскільки масиви CLR створюються в купі, змінні масивів - це дескриптори, що відслідковують завжди. От приклад оголошення змінної масиву:

array<int>^ data;

Змінна масиву data може зберігати посилання на одномірний масив елементів типу int.

Ви можете створити масив CLR, використовуючи операцію gcnew, одночасно з оголошенням змінної масиву:

array<int>^ data = gcnew array<int> (100) ; // Створити масив для зберігання 100 цілих чисел

Цей оператор створює одномірний масив по імені data (зверніть увагу, що змінна масиву - відслідковує дескриптор, що, тому не можна забувати про символ "капелюха", що випливає за специфікацією типу елемента, укладеної в кутові дужки). Кількість елементів указується в круглих дужках, що випливають за специфікацією типу масиву, також укладене в кутові дужки. Тобто в цьому випадку це буде масив, що містить 100 елементів типу int.

Як й у масивах рідного C++, елементи масивів CLR індексуються, починаючи з нуля, тому можна встановити значення елементів масиву data у такий спосіб:

for(int i = 0 ; i<100 ; i++) data[i] = 2* (i+1);

Цикл установлює значення елементів рівними 2, 4, 6, і так далі - до 200.

У попередньому циклі кількість оброблюваних елементів у циклі задане як літеральне значення. Але краще використати властивість Length масиву, що зберігає число елементів масиву:

for(int i = 0 ; i < data->Length ; i++) data[i] = 2*(i+l);

Щоб звернутися до властивості Length, тут використається операція ->, тому що data - відслідковує дескриптор, що, що працює подібно покажчику. Ця властивість зберігає кількість значень як 32-бітне ціле. Можна одержати довжину масиву і як 64-бітне ціле через властивість LongLength.

Змінна масиву може зберігати адреса будь-якого масиву того ж рангу (ранг - це кількість вимірів, що у випадку масиву data дорівнює 1) і типу елементів. Наприклад:

data = gcnew array<int> (45) ;

Цей оператор створює новий одномірний масив з 45 елементів типу int і зберігає його адресу в data. Вихідний масив відкидається.

Також можна створити масив, указати набір початкових значень елементів:

array<double>^ samples = { 3.4, 2.3, 6.8, 1.2, 5.5, 4.9. 7.4, 1.6};

Розмір масиву визначається кількістю ініціюючих значень, укладених у фігурні дужки, у цьому випадку - 8, причому значення привласнюються елементам послідовно.

Звичайно, елементи масиву можуть бути будь-якого типу, тому дуже легко можна створити масив рядків:

array<String>^ names = { "Jack", "Jane", "Joe", "Jessica", "Jim", "Joanna"};

Елементи цього масиву инициализируются рядками, які укладені у фігурні дужки, і кількість цих рядків визначає число елементів у масиві. Об'єкти String розміщаються в купі CLR, тому типом елементів цього масиву є тип дескрипторів, що відслідковують- String^.

Якщо ви оголосите змінну масиву, не iнiцiалiзу’эться її, то повинні потім явно створити масив, якщо хочете використати список ініціюючих значень. Наприклад:

аггау<String^>^ names; // Оголошення змінної масиву

names = gcnew array<String>{ "Jack", "Jane", "Joe", "Jessica", "Jim", "Joanna"};

Другий оператор створює масив й инициализирует його рядками у фігурних дужках. Без явного виклику gcnew цей оператор не зкомпiлюеться.

Ви можете використати функцію Clear (), що визначена в класі Array для установки будь-якої послідовності числових елементів масиву в нульове значення, наприклад:

Array::Clear(samples, 0, samples->Length); // Установити всі елементи в нуль

Перший аргумент Clear () - масив, що повинен бути очищений, другий - індекс першого елемента, що очищає, а третій - кількість елементів, що підлягають очищенню. Таким чином, у цьому прикладі всім елементам масиву samples привласнюється значення 0.0. Якщо ви застосуєте функцію Clear () до масиву дескрипторів, таких як String^, те елементи встановлюються в null, а якщо застосувати її до масиву об'єктів bool, те вони одержать значення false.