Передача массива в функцию

Функции. Часть 2. Функции и массивы. Передача одномерного и многомерного массива в функцию. Передача структуры и класса в функцию

Передача массива в функцию

Данная тема основана на теме:  Функции. Часть 1. Описание функции. Фактические и формальные параметры. Передача параметров в функцию по значению и по адресу. Прототип функции

1. Пример определения функции, получающей массив целых чисел

Для передачи массива чисел в функцию, нужно передать указатель на этот массив чисел.

Указателем на массив чисел есть:

  • имя массива;
  • адреса первого элемента массива.

Пример. Пусть нужно описать функцию SumArrayInts(), которая получает массив из целых чисел и находит сумму элементов этого массива. Функция получает 2 параметра:

  • массив целых чисел;
  • число элементов в массиве.

Способ 1. Передача массива как int A[].

// Функция, которая подсчитывает сумму элементов массива целых чисел // Функция получает 2 параметра: //     n — число элементов массива, //     A — массив целых чисел int SumArrayInts(int n, int A[]) { int i; int sum = 0; // сумма for (i=0; i0, если строка s1 следует после строки s2 в лексикографическом порядке;

  • =0, если строки равны между собой;
  • y)) f = true; return f; }

    Вызов функции EqualsPRef() из другого программного кода (например, обработчика события клика на кнопке):

    // если структура объявлена как ссылочный тип // с ключевым словом ref MyPoint mp1; // управляемый указатель на структуру MyPoint mp2; // выделение памяти под структурные переменные mp1 = gcnew MyPoint; mp2 = gcnew MyPoint; // заполнение полей структуры 1 mp1->x = 30; mp1->y = -30; // заполнение полей структуры 2 mp2->x = 28; mp2->y = -30; // определение результата, вызов функции bool res; res = EqualsPRef(mp1, mp2); // res = false

    8. Как в качестве параметра функции передать объект класса?

    Пусть дан класс MyPointClass, описывающий координаты точки на плоскости. Класс определен в двух модулях:

    • в модуле MyPointClass.h описывается описание функций и полей класса;
    • в модуле MyPointClass.cpp описывается реализация методов и полей класса.

    Текст модуля MyPointClass.h:

    #pragma once // класс объявлен как «managed» — управляемый ref class MyPointClass { int x; int y; public: MyPointClass(void); int GetX(void); int GetY(void); void SetXY(int nx, int ny); };

    Текст модуля MyPointClass.cpp:

    #include «StdAfx.h» #include «MyPointClass.h» MyPointClass::MyPointClass(void) { x = 0; y = 0; } int MyPointClass::GetX(void) { return x; } int MyPointClass::GetY(void) { return y; } // установить новое значение x и y void MyPointClass::SetXY(int nx, int ny) { x = nx; y = ny; }

    Пусть в главном модуле программы (например, класс формы) описана функция EqualsClass(), которая сравнивает поля класса MyPointClass. Функция получает два параметра – управляемые указатели на класс (). Передать класс как параметр-значения не удастся, поскольку класс принадлежит к ссылочному типу. С классом нужно использовать управляемые указатели ().

    Более подробно об управляемых и неуправляемых указатели описывается здесь.

    // функция, которая получает переменную-указатель на класс как параметр // функция сравнивает на равенство поля класса bool EqualsClass(MyPointClass p1, MyPointClass p2) { int x1, y1, x2, y2; bool res = false; x1 = p1->GetX(); y1 = p1->GetY(); x2 = p2->GetX(); y2 = p2->GetY(); if ((x1==x2) && (y1==y2)) res = true; return res; }

    Вызов функции EqualsClass() из другого программного кода (например, из обработчика события):

    // передача класса в функцию MyPointClass pc1; // объект, переменная типа класс, в функцию как параметр передавать нельзя MyPointClass pc2 = gcnew MyPointClass(); // управляемый указатель на класс — можно передавать в функцию MyPointClass pc3 = gcnew MyPointClass(); // управляемый указатель на класс bool f; // установление значений переменных pc1.SetXY(4, 2); pc2->SetXY(5, 2); pc3->SetXY(5, 2); f = EqualsClass(pc2, pc3); // f = true, работает

    Чтобы использовать методы класса, нужно предварительно подключить модуль MyPointClass.h:

    #include «MyPointClass.h»

    9. Пример передачи структуры в функцию по ссылке (не поддерживается в среде CLR)

    Структуру можно передавать в функцию по ссылке. Ниже дается программный код объявления структуры MyPoint, которая передается в функцию EqualsR() по ссылке для приложений типа Win32. Для приложений, работающих в среде CLR такой способ передачи параметра не поддерживается.

    struct MyPoint { int x; int y; }; // передача по ссылке bool EqualsR(MyPoint& mp1, MyPoint& mp2) { bool res = false; if ((mp1.x == mp2.x) && (mp1.y == mp2.y)) res = true; return res; };

    Использование функции EqualsR() в другом программном коде

    bool res; MyPoint p1, p2; p1.x = 23; p1.y = 23; p2.x = 26; p2.y = 23; res = EqualsR(p1, p2);  // res = false

    Связанные темы

    Источник: https://www.bestprog.net/ru/2017/04/22/%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D1%87%D0%B0%D1%81%D1%82%D1%8C-2-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D1%8B-%D0%BF%D0%B5%D1%80%D0%B5/

    Передача массива в функцию

    Передача массива в функцию

    Определение 1

    Передача массива в функцию — это передача указателя на данный массив.

    Если массив применяется как функциональный аргумент, то можно передавать лишь адрес массива, а не его полную скопированную версию.

    Когда вызывается функция, содержащая имя массива, в функцию пересылается метка, указывающая на начальный компонент массива.

    Чтобы передать числовой массив в функцию, необходимо выполнить передачу указателя на данный числовой массив. Указатель должен содержать в своём составе:

    1. Наименование числового массива.
    2. Адресация начального компонента массива.

    Рассмотрим конкретный случай. Необходимо выполнить описание функционала SumArrаyInts(), который должен получить целочисленный массив и найти суммарный вес всех компонентов выбранного массива. Функция должна получить два параметра:

    1. Целочисленный массив.
    2. Количество компонентов в массиве.

    Рассмотрим разные возможные варианты выполнения этой задачи. Вариант номер один. Массив передаётся в форме int А[].

    Рисунок 1. Вариант первый. Автор24 — интернет-биржа студенческих работ

    Ничего непонятно?

    Попробуй обратиться за помощью к преподавателям

    Вариант номер два. Массив передаётся в форме int *А.

    Рисунок 2. Вариант второй. Автор24 — интернет-биржа студенческих работ

    Необходимо отметить, что при выполнении этой пересылки массива в функцию, величины компонентов массива возможно менять в самой функции.

    Передача символьной строки в функцию

    Символьная строчка по сути является массивом компонентов с типом char. Это означает, что пересылать символьную строку в функцию посредством параметра, можно таким же образом, как и с целочисленными значениями. Символьную строчку возможно переслать в функцию так же двумя методами:

    1. В формате char*.
    2. В формате char[].

    Рассмотрим пример. Функция, возвращающая количество плюсовых символов в строчке. Нет необходимости сообщать функции размер строки, так как существует признак окончания строчки и это символ ‘\0’.

    Вариант номер один. Определяется функция GеtNРlus(). Строчка передаётся как chаr *.

    Рисунок 3. Вариант первый. Автор24 — интернет-биржа студенческих работ

    Вариант номер два. Определяется функция GetNPlus2(). Для организации обращения к символике строчки применяется индексация.

    Рисунок 4. Вариант второй. Автор24 — интернет-биржа студенческих работ

    Передача строкового массива в функцию

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

    Рисунок 5. Передача строкового массива в функцию. Автор24 — интернет-биржа студенческих работ

    В приведённой выше функции применяется функционал strсm р(), который выполняет сравнение двух строчек s1 и s2 в порядке лексической графики: n = strсm р(s1. s2);

    и возврат значения:

    1. $> 0$, если строчка s1 идёт за строчкой s2 в порядке лексической графики.
    2. $= 0$, если присутствует равенство строчек.
    3. < 0, если строчка s1 стоит перед строчкой s2 в порядке лексической графики.

    Вызывается функция из иного программного кода:

    Рисунок 6. Программный код. Автор24 — интернет-биржа студенческих работ

    Трансляция двумерного массива в функцию

    Рассмотрим образец взаимодействия двумерного массива, как параметра, и функции. Здесь выполняется задание функции, которая вычисляет суммарный вес всех компонентов двумерного массива. Функция получит двумерный вещественный числовой массив в качестве параметрических данных.

    Рисунок 7. Числовой массив. Автор24 — интернет-биржа студенческих работ

    Вызывается функция из кода программы. Осуществляется пересылка в функцию двумерного массива, именуемого М и имеющего размер два на три.

    Рисунок 8. Пересылка. Автор24 — интернет-биржа студенческих работ

    Передача трёхмерного числового массива в функцию

    Рассмотрим пример передачи трёхмерного числового массива в функцию. В этом примере даётся описание функции Sum3(), получающей в качестве исходных параметров трёхмерный целочисленный массив, величиной два на три на четыре. Функция выполняет возврат суммы всех компонентов массива.

    Рисунок 9. Передача трёхмерного числового массива в функцию. Автор24 — интернет-биржа студенческих работ

    Передача структуры в функцию

    Рассмотрим примерный образец, как может передаваться структура в функцию. Существует два способа передачи структуры в виде параметра в функцию:

    1. По смыслу (значению).
    2. По адресному значению.

    При выполнении передачи структуры по значению выполняется копирование с сохранением в стеке всех граф переменной на базе структуры. При выполнении передачи структуры по адресу пересылается лишь адресное расположение структуры в памяти (структурный указатель).

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

    Структурный указатель, передаваемый в функцию, бывает таких видов:

    1. Без возможности управления (*).
    2. С возможностью управления (). В данном случае структура может быть объявлена при помощи контрольного слова.

    Рассмотрим пример. Необходимо выполнить передачу объекта, представляющего структуру, по значению, а также по адресу. Дано условие, что за границами класса есть структура, описывающая точку в плоской системе координат:

    Рисунок 10. Условие. Автор24 — интернет-биржа студенческих работ

    И существуют две функции, определяющие равенство точек друг с другом:

    1. Функция Equals(), получающая в параметрическом виде две структуры вида MyPoint (передаваемые значением).
    2. Функция EqualsP(), получающая два указателя вида MyPoint (передаваемые адресом).

    Рисунок 11. Функции. Автор24 — интернет-биржа студенческих работ

    В этом случае обращение к функциям Equals() и EqualsP() возможно выполнить из иного кода программы в таком виде:

    Рисунок 12. Обращение к функциям. Автор24 — интернет-биржа студенческих работ

    Рассмотрим пример передачи в функцию структурного указателя по типу ссылки с возможностью управления. В этом примере показана пересылка в функцию указателя на структуру с возможностью управления.

    В функции EqualsPRef() предоставлены два структурных указателя с возможностью управления вида MyPoint. Функция должна определить равны ли поля указанных структур.

    Указатель MyPoint описывается в таком виде:

    Рисунок 13. Указатель. Автор24 — интернет-биржа студенческих работ

    Функция EqualsPRef() задаётся с помощью этой программы:

    Рисунок 14. Функция EqualsPRef().Автор24 — интернет-биржа студенческих работ

    Функция EqualsPRef() вызывается из иного кода программы (к примеру, программы обработки нажатия кнопки):

    Рисунок 15. Функция EqualsPRef().Автор24 — интернет-биржа студенческих работ

    Передача функции в виде параметра класса объекта

    Имеем класс MyPointClass, который описывает координаты точки в плоскости. Он определяется двумя модулями:

    1. MyPointClass.h содержит характеристики функций и полей класса.
    2. MyPointClass.cpp содержит описания построения способов и полей класса.

    Текстовый вариант модуля MyPointClass.h приведён ниже:

    Рисунок 16. Текстовый вариант модуля MyPointClass. Автор24 — интернет-биржа студенческих работ

    Текстовый вариант модуля MyPointClass.cpp:

    Рисунок 17. Текстовый вариант модуля MyPointClass.cpp. Автор24 — интернет-биржа студенческих работ

    Источник: https://spravochnick.ru/informatika/peredacha_massiva_v_funkciyu/

  • Booksm
    Добавить комментарий