- Функции. Часть 2. Функции и массивы. Передача одномерного и многомерного массива в функцию. Передача структуры и класса в функцию
- 1. Пример определения функции, получающей массив целых чисел
- 8. Как в качестве параметра функции передать объект класса?
- 9. Пример передачи структуры в функцию по ссылке (не поддерживается в среде CLR)
- Связанные темы
- Передача массива в функцию
- Передача символьной строки в функцию
- Передача строкового массива в функцию
- Трансляция двумерного массива в функцию
- Передача трёхмерного числового массива в функцию
- Передача структуры в функцию
- Передача функции в виде параметра класса объекта
Функции. Часть 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 в лексикографическом порядке;
Вызов функции 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
Передача массива в функцию — это передача указателя на данный массив.
Если массив применяется как функциональный аргумент, то можно передавать лишь адрес массива, а не его полную скопированную версию.
Когда вызывается функция, содержащая имя массива, в функцию пересылается метка, указывающая на начальный компонент массива.
Чтобы передать числовой массив в функцию, необходимо выполнить передачу указателя на данный числовой массив. Указатель должен содержать в своём составе:
- Наименование числового массива.
- Адресация начального компонента массива.
Рассмотрим конкретный случай. Необходимо выполнить описание функционала SumArrаyInts(), который должен получить целочисленный массив и найти суммарный вес всех компонентов выбранного массива. Функция должна получить два параметра:
- Целочисленный массив.
- Количество компонентов в массиве.
Рассмотрим разные возможные варианты выполнения этой задачи. Вариант номер один. Массив передаётся в форме int А[].
Рисунок 1. Вариант первый. Автор24 — интернет-биржа студенческих работ
Ничего непонятно?
Попробуй обратиться за помощью к преподавателям
Вариант номер два. Массив передаётся в форме int *А.
Рисунок 2. Вариант второй. Автор24 — интернет-биржа студенческих работ
Необходимо отметить, что при выполнении этой пересылки массива в функцию, величины компонентов массива возможно менять в самой функции.
Передача символьной строки в функцию
Символьная строчка по сути является массивом компонентов с типом char. Это означает, что пересылать символьную строку в функцию посредством параметра, можно таким же образом, как и с целочисленными значениями. Символьную строчку возможно переслать в функцию так же двумя методами:
- В формате char*.
- В формате char[].
Рассмотрим пример. Функция, возвращающая количество плюсовых символов в строчке. Нет необходимости сообщать функции размер строки, так как существует признак окончания строчки и это символ ‘\0’.
Вариант номер один. Определяется функция GеtNРlus(). Строчка передаётся как chаr *.
Рисунок 3. Вариант первый. Автор24 — интернет-биржа студенческих работ
Вариант номер два. Определяется функция GetNPlus2(). Для организации обращения к символике строчки применяется индексация.
Рисунок 4. Вариант второй. Автор24 — интернет-биржа студенческих работ
Передача строкового массива в функцию
Рассмотрим примерный вариант взаимодействия строкового массива с функцией. То есть функция получит строковый массив и отсортирует его способом вставки. В качестве первого параметра идёт пересылка строкового массива, а второй параметр содержит количество строк.
Рисунок 5. Передача строкового массива в функцию. Автор24 — интернет-биржа студенческих работ
В приведённой выше функции применяется функционал strсm р(), который выполняет сравнение двух строчек s1 и s2 в порядке лексической графики: n = strсm р(s1. s2);
и возврат значения:
- $> 0$, если строчка s1 идёт за строчкой s2 в порядке лексической графики.
- $= 0$, если присутствует равенство строчек.
- < 0, если строчка s1 стоит перед строчкой s2 в порядке лексической графики.
Вызывается функция из иного программного кода:
Рисунок 6. Программный код. Автор24 — интернет-биржа студенческих работ
Трансляция двумерного массива в функцию
Рассмотрим образец взаимодействия двумерного массива, как параметра, и функции. Здесь выполняется задание функции, которая вычисляет суммарный вес всех компонентов двумерного массива. Функция получит двумерный вещественный числовой массив в качестве параметрических данных.
Рисунок 7. Числовой массив. Автор24 — интернет-биржа студенческих работ
Вызывается функция из кода программы. Осуществляется пересылка в функцию двумерного массива, именуемого М и имеющего размер два на три.
Рисунок 8. Пересылка. Автор24 — интернет-биржа студенческих работ
Передача трёхмерного числового массива в функцию
Рассмотрим пример передачи трёхмерного числового массива в функцию. В этом примере даётся описание функции Sum3(), получающей в качестве исходных параметров трёхмерный целочисленный массив, величиной два на три на четыре. Функция выполняет возврат суммы всех компонентов массива.
Рисунок 9. Передача трёхмерного числового массива в функцию. Автор24 — интернет-биржа студенческих работ
Передача структуры в функцию
Рассмотрим примерный образец, как может передаваться структура в функцию. Существует два способа передачи структуры в виде параметра в функцию:
- По смыслу (значению).
- По адресному значению.
При выполнении передачи структуры по значению выполняется копирование с сохранением в стеке всех граф переменной на базе структуры. При выполнении передачи структуры по адресу пересылается лишь адресное расположение структуры в памяти (структурный указатель).
Второй метод будет более предпочтительным, когда под информационные данные структуры требуются значительные объёмы памяти. Тогда величина указателя будет существенно меньше величины переменной, определяемой структурой.
Структурный указатель, передаваемый в функцию, бывает таких видов:
- Без возможности управления (*).
- С возможностью управления (). В данном случае структура может быть объявлена при помощи контрольного слова.
Рассмотрим пример. Необходимо выполнить передачу объекта, представляющего структуру, по значению, а также по адресу. Дано условие, что за границами класса есть структура, описывающая точку в плоской системе координат:
Рисунок 10. Условие. Автор24 — интернет-биржа студенческих работ
И существуют две функции, определяющие равенство точек друг с другом:
- Функция Equals(), получающая в параметрическом виде две структуры вида MyPoint (передаваемые значением).
- Функция EqualsP(), получающая два указателя вида MyPoint (передаваемые адресом).
Рисунок 11. Функции. Автор24 — интернет-биржа студенческих работ
В этом случае обращение к функциям Equals() и EqualsP() возможно выполнить из иного кода программы в таком виде:
Рисунок 12. Обращение к функциям. Автор24 — интернет-биржа студенческих работ
Рассмотрим пример передачи в функцию структурного указателя по типу ссылки с возможностью управления. В этом примере показана пересылка в функцию указателя на структуру с возможностью управления.
В функции EqualsPRef() предоставлены два структурных указателя с возможностью управления вида MyPoint. Функция должна определить равны ли поля указанных структур.
Указатель MyPoint описывается в таком виде:
Рисунок 13. Указатель. Автор24 — интернет-биржа студенческих работ
Функция EqualsPRef() задаётся с помощью этой программы:
Рисунок 14. Функция EqualsPRef().Автор24 — интернет-биржа студенческих работ
Функция EqualsPRef() вызывается из иного кода программы (к примеру, программы обработки нажатия кнопки):
Рисунок 15. Функция EqualsPRef().Автор24 — интернет-биржа студенческих работ
Передача функции в виде параметра класса объекта
Имеем класс MyPointClass, который описывает координаты точки в плоскости. Он определяется двумя модулями:
- MyPointClass.h содержит характеристики функций и полей класса.
- MyPointClass.cpp содержит описания построения способов и полей класса.
Текстовый вариант модуля MyPointClass.h приведён ниже:
Рисунок 16. Текстовый вариант модуля MyPointClass. Автор24 — интернет-биржа студенческих работ
Текстовый вариант модуля MyPointClass.cpp:
Рисунок 17. Текстовый вариант модуля MyPointClass.cpp. Автор24 — интернет-биржа студенческих работ
Источник: https://spravochnick.ru/informatika/peredacha_massiva_v_funkciyu/