Привет друзья! Из видео 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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Микрофон ёмкостный электретный 6х5мм

Микрофон ёмкостный электретный 6х5мм

Миниатюрный монофонический микрофон с двумя ножкамиДиаметр 6 ммДлина 5 ммТип электретныйЧувствительн..

7.60грн.

DC-DC повышающий модуль 10А 12-50В

DC-DC повышающий модуль 10А 12-50В

Импульсный преобразователь стабилизированного постоянного напряжения повышающий на основе микросхемы..

247.71грн.

Линейка разработчика печатных плат PCB

Линейка разработчика печатных плат PCB

Линейка PCB для наглядного представления о размерах посадочных мест различных стандартов поверхностн..

64.97грн.

Модуль 5 — Датчики и модули: DHT11, LDR и проект «Умная лампа»

Модуль 5 — Датчики и модули: DHT11, LDR и проект «Умная лампа»

Модуль 5 — Датчики и модули (курс для начинающих) Цель модуля: познакомиться с популярными ..

Радиомодуль nRF24L01 (2,4 ГГц, SPI)

Радиомодуль nRF24L01 (2,4 ГГц, SPI)

Радиомодуль nRF24L01 (2,4 ГГц, SPI) nRF24L01 — компактный радиопередатчик‑приёмник для беспрово..

54.65грн.