Привет друзья! Из видео Arduino функции мы уже знаем, что в функцию можно передавать много переменных, а возвращать она может: или ничего (тип void), или только одну переменную с типом, указанным при объявлении функции. Но что делать, если есть необходимость возвращать из функции две и более переменных?


Для решения этой задачи есть несколько способов. Сейчас мы их рассмотрим.

Самый простой вариант – это использование глобальных переменных внутри функции.


Создаем глобальные переменные a и b типа integer. И внутри функции my_func проводим над ними математические манипуляции. 

При каждом вызове функции обе переменные a и b будут изменяться. При этом способе функция изменяет значения только конкретных глобальных переменных, и не идет речь о возвращении разных переменных при множественном обращении к функции в программе. То есть, если в этом примере нужно будет изменять значения параллельно, и у других переменных, например, c и d при помощи существующей функции, то напрямую это не получится.

Результат выполнения этого скетча на мониторе порта. Здесь первая переменная увеличивается, а вторая уменьшается на единицу.

Способ прост в понимании и использовании, но мало функционален.

Более изящный способ – это передача значений переменных функции по ссылке. Для переменных, которые вы хотите изменить. Здесь уже глобальные переменные не обязательны. Основная идея здесь, что функция может возвращать некоторые входные переменные уже с изменённым значением.


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

Функция будет изменять значения входных переменных. Если при вызове функции передать ей переменные a и b, то она произведет с ними вычисления и присвоит им новые значения. Здесь в примере первая переменная увеличивается на единицу, а вторая уменьшается на единицу при каждом вызове функции. Входная переменная может использоваться в этом случае и как входная информация и как ячейка для хранения выходной информации.

Результат выполнения данного примера в окне монитора порта. Здесь при первом вызове функции изменились значения переменных a и b. А дальше циклично изменяются значения второй пары переменных.

Этот способ сложнее для понимания, но максимально удобен и гибок. Подходит для большинства задач. Он действительно крут!

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


Сначала объявляется структура под названием my_Struct. В ней место под две переменные типа integer. Здесь потенциально может быть много переменных различного типа.

Потом идет объявление переменной datas с созданным нами типом my_Struct.

Функцию объявляем тоже с типом my_Struct. И в самой функции тоже нужно объявить переменную типа my_Struct, которая будет передаваться наружу через операнд return.

Вызов функции вставлен в loop(). Здесь функция с типом нашей структуры передает значения двух переменных типа integer, запакованные в структуру.

Результат выполнения такого скетча выведен в монитор порта.


Данный способ будет полезен в проектах, где целесообразно использовать структуры данных для описания свойств объектов.

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



Желаю вам достичь космических высот в изучении и применении языка C. И применить эти знания на практике с пользой для себя и окружающих. Спасибо за внимание и до новых встреч!

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Датчик вращения енкодер KY-040

Датчик вращения енкодер KY-040

Енкодер вращения KY-040 - это поворотный датчик, который индицирует степень поворота оси и в каком н..

37.93грн.

Стойка нейлоновая М3 18мм + 6мм

Стойка нейлоновая М3 18мм + 6мм

Стойка для крепления различных електронных модулей к корпусу устройстваВысота стойки 18 ммДлина внеш..

5.18грн.

Твердотельное реле 10А

Твердотельное реле 10А

Реле без механических контактов на 10 А. Силовым элементом данного реле является симистор.Гальваниче..

281.48грн.

ЧТО ТАКОЕ ТРАНЗИСТОР?

ЧТО ТАКОЕ ТРАНЗИСТОР?

Термин «биполярный транзистор» связан с тем, что в этих транзисторах используются носители зарядов д..

Циклы 4 — Цикл do...while

Циклы 4 — Цикл do...while

Циклы 4 — Цикл do...while Введение Цикл do...while — это разновидность цикла while, но с..