Як передати масив у функцію


 

Масиви є однією з найбільш інтенсивно використовуваних форм структурованого зберігання даних в програмах для ЕОМ. Їх обробка може здійснюватися різними алгоритмами, реалізованими в методах класів і функціях. Відповідно, часто потрібно передати масив у функцію. Велику свободу у виборі способів вчинення даної дії пропонують мови C і C + +.



Вам знадобиться

— компілятори мов C і C + +.

Інструкція

  1. Передайте у функцію масив фіксованого розміру. Прототип функції змініть таким чином, щоб він містив аргумент відповідного типу. Наприклад, декларація функції, що приймає як параметр масив цілих числових значень з трьох елементів, може виглядати наступним чином:

    void ArrayFunction (int aNumbers [3]);

    Виклик такої функції здійснюється шляхом передачі їй безпосередньо масиву як аргумент:

    void SomeFunction ()
    {
    int aNumbers [] = {1, 2, 3};
    ArrayFunction (aNumbers);
    }

    Передані дані копіюються в стек. Модифікація масиву в викликається функції не призводить до зміни джерела.


  2. Передавайте в функцію масиви змінної довжини. Для цього просто не специфікує розмірність відповідного аргументу:

    void ArrayFunction (int aNumbers []);

    Багатовимірні масиви також можна передавати подібним чином (змінним може бути тільки перше «вимір»):

    void ArrayFunction (int aNumbers [] [3] [2]);

    Виклик подібних функцій проводиться тим же чином, що і в першому кроці.

    Для того щоб мати можливість коректно обробляти масиви змінної довжини в функції, необхідно або явно передавати кількість їх елементів через додатковий параметр, або використовувати угоди, що накладають обмеження на значення самих елементів (певне значення має бути ознакою кінця масиву).


  3. Передайте масив за вказівником. Аргументом функції повинен бути покажчик на значення з типом, відповідним елементам масиву. Наприклад:

    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]); / / починаючи з другого елементу
    }

    Даний спосіб також зазвичай передбачає передачу кількості доступних елементів в додатковому параметрі або використання ознаки кінця масиву.


  4. Здійсніть передачу даних у функцію з параметром, що є об'єктом або посиланням на об'єкт класу, що реалізує функціонал масиву. Подібні класи або шаблони класів зазвичай входять до складу популярних бібліотек та фреймворків (QVector в Qt, CArray в MFC, std :: vector в STL, і т.д.).

    Часто дані класи реалізують стратегію неявного спільного використання даних (implicit data sharing) з підрахунком посилань (reference counting), виконуючи глибоке копіювання тільки при модифікації даних (copy on write). Це дозволяє мінімізувати споживання обчислювальних ресурсів навіть у разі передачі об'єктів масивів за значенням через аргументи функцій і методів:

    void ArrayFunction (QVector oArray)
    {
    int nItemCount = oArray.count ();
    int nItem = oArray [0];
    }

    void SomeFunction ()
    {
    QVector oArray (10);

    for (int i = 0; i
    oArray [i] = i;

    ArrayFunction (oArray);
    }

    До того ж подібні класи зазвичай підтримують зручні можливості, такі як динамічна зміна розміру масиву, пошук, сортування і т.д.