Масиви є однією з найбільш інтенсивно використовуваних форм структурованого зберігання даних в програмах для ЕОМ. Їх обробка може здійснюватися різними алгоритмами, реалізованими в методах класів і функціях. Відповідно, часто потрібно передати масив у функцію. Велику свободу у виборі способів вчинення даної дії пропонують мови C і C + +.
Вам знадобиться
— компілятори мов C і C + +.
Інструкція
- Передайте у функцію масив фіксованого розміру. Прототип функції змініть таким чином, щоб він містив аргумент відповідного типу. Наприклад, декларація функції, що приймає як параметр масив цілих числових значень з трьох елементів, може виглядати наступним чином:
void ArrayFunction (int aNumbers [3]);
Виклик такої функції здійснюється шляхом передачі їй безпосередньо масиву як аргумент:
void SomeFunction ()
{
int aNumbers [] = {1, 2, 3};
ArrayFunction (aNumbers);
}
Передані дані копіюються в стек. Модифікація масиву в викликається функції не призводить до зміни джерела.
- Передавайте в функцію масиви змінної довжини. Для цього просто не специфікує розмірність відповідного аргументу:
void ArrayFunction (int aNumbers []);
Багатовимірні масиви також можна передавати подібним чином (змінним може бути тільки перше «вимір»):
void ArrayFunction (int aNumbers [] [3] [2]);
Виклик подібних функцій проводиться тим же чином, що і в першому кроці.
Для того щоб мати можливість коректно обробляти масиви змінної довжини в функції, необхідно або явно передавати кількість їх елементів через додатковий параметр, або використовувати угоди, що накладають обмеження на значення самих елементів (певне значення має бути ознакою кінця масиву).
- Передайте масив за вказівником. Аргументом функції повинен бути покажчик на значення з типом, відповідним елементам масиву. Наприклад:
void ArrayFunction (int * pNumbers);
Доступ до даних у функції може здійснюватися як в нотації роботи з елементами масиву, так і за допомогою адресної арифметики:
void ArrayFunction (int * pNumbers)
{
pNumbers [0] = 10; / / доступ до елемента 0
* (PNumbers + 1) = 20; / / доступ до елемента 1
}
Будьте уважні! Оскільки у функцію передається не копія даних, а покажчик на них, модифікації буде підданий вихідний масив.
Перевагою даного методу є швидкість, економія обчислювальних ресурсів і певна гнучкість. Так, можна викликати цільову функцію, передавши їй покажчик на довільний елемент масиву:
void SomeFunction ()
{
int aNumbers [] = {1, 2, 3};
ArrayFunction (aNumbers); / / весь масив
ArrayFunction (& aNumbers [1]); / / починаючи з другого елементу
}
Даний спосіб також зазвичай передбачає передачу кількості доступних елементів в додатковому параметрі або використання ознаки кінця масиву.
- Здійсніть передачу даних у функцію з параметром, що є об'єктом або посиланням на об'єкт класу, що реалізує функціонал масиву. Подібні класи або шаблони класів зазвичай входять до складу популярних бібліотек та фреймворків (QVector в Qt, CArray в MFC, std :: vector в STL, і т.д.).
Часто дані класи реалізують стратегію неявного спільного використання даних (implicit data sharing) з підрахунком посилань (reference counting), виконуючи глибоке копіювання тільки при модифікації даних (copy on write). Це дозволяє мінімізувати споживання обчислювальних ресурсів навіть у разі передачі об'єктів масивів за значенням через аргументи функцій і методів:
void ArrayFunction (QVectoroArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}void SomeFunction ()
{
QVectoroArray (10); for (int i = 0; i
oArray [i] = i;ArrayFunction (oArray);
}
До того ж подібні класи зазвичай підтримують зручні можливості, такі як динамічна зміна розміру масиву, пошук, сортування і т.д.