Возврат с функции несколько значений.

Тема в разделе "Arduino & Shields", создана пользователем Alexey Zhigalo, 26 июл 2016.

  1. Доброго времени суток!
    Подскажите пожалуйста, возможно ли вернуть с функции несколько значений ?

    Написал функцию, которая, добавляет к указанному времени интервал в минутах.
    То есть, у нас есть время, допустим, 15:04:25

    Нам надо выполнить какое нибудь действие через 35 мин.
    То есть, мы должны получить время, 15:39:25

    Если у нас, допустим время 15:54:22
    И надо выполнить какое нибудь действие через 55 мин.
    То мы должны получить время, 16:49:22

    Вот написанная мною функция интервала, которая принимает значения:
    Код (C++):
    int hour, int minute, int second, int interval_minuts
    И должна возвратить часы, минуты, секунды с добавленным интервалом.

    Но, как возвратить несколько значений, меня поставило в тупик.
    Вот сам код функции.

    Код (C++):
    void time_intrval(int hour, int minute, int second, int interval_minuts)
    {
       int hours = 0;
       int minuts = 0;
       int seconds = second;

      if(interval_minuts <= 1439) // interval <= 23:59:00
      {
        if((minute + interval_minuts < 60))
        {
          minuts = minute + interval_minuts;
          hours = hour;
        }
        else
        {
          minuts = minute + interval_minuts;
          hours =  hour;
       
         while((minuts >= 60))
         {
           hours++;
           if(hours >=24)
              hours = 0;
         
           minuts = minuts - 60;
         }
        }
      }
       Serial.println((String)hours + ":" + (String)minuts + ":" + (String)seconds);
      }  
    Данная функция добавляет к указному времени интервал в минутах, и выводит его в терминал.
    Но, надо вернуть эти значения, и дальше их обрабатывать.
     
  2. DIYMan

    DIYMan Guest

    Есть пару вариантов:

    1. Возвращать в структуре:
    Код (C++):
    typedef struct
    {
    int hour;
    int minute;
    int second;
    } t_ret;

    t_ret time_intval(int hour, int minute, int second)
    {
       t_ret t;
       t.hour = hour + 1;
      ...
    return t_ret;
    }
    2. Передавать параметры в функцию по ссылке:
    Код (C++):
    void time_intrval(int& hour, int& minute, int& second, int interval_minuts)
    {
    hour += interval_minuts;
    }

    int h = 10, m=20, s = 30;
    Serial.print("Hour before call: ");
    Serial.println(h);
    time_intrval(h,m,s,2);
    Serial.print("Hour after call: ");
    Serial.println(h);
     
     
  3. Хорошо, допустим мне надо создать 4 интервала, каждый по себе, работает отдельно.
    То есть, мне надо создавать 4 структуры или 4 группы переменных ?

    Интервалом может быть и 16
     
  4. DIYMan

    DIYMan Guest

    Структуру можно передавать как параметр функции, по ссылке. Я вам дал всё необходимое для понимания.
     
    РусНекромант нравится это.
  5. fogary

    fogary Гик

    Нет, структуру определяете один раз - это тип данных (как int, char, double, ...). Переменных с типом этой структуры, можете объявить сколько Вам нужно.
     
  6. А можно поподробнее ? А то, со структурой ни разу не работал.
     
  7. ИгорьК

    ИгорьК Гуру

  8. ostrov

    ostrov Гуру

    Указатель можно вернуть на массив например.
     
  9. Onkel

    Onkel Гуру

    сделайте переменные глобальными и меняйте их в функции, делов- то. Вам же три переменных только нужно, не так ли?
     
  10. Тоже думал об глобальных переменных. Но. Мне на данный момент надо создавать 4 интервала.
    В лупе мы проверяем соответствует ли реальное время к времени с интервалом.
    Таких проверок должно быть 4.
    То есть, как понимаю, нам надо создать 4 * 3 переменных (h,m,s).

    Если это не так, поправьте.
     
  11. fogary

    fogary Гик

    Вам же уже давали пример со структурой:
    Код (C++):
    typedef struct
    {
    int hour;
    int minute;
    int second;
    } t_ret;
    Здесь, t_ret - название структуры. Можете назвать по-своему. Вместо int, достаточно указать тип byte.

    Объявите четыре (или сколько требуется) переменных, например:
    Код (C++):
    t_ret t1, t2, t3, t4;
     
    Соответственно, доступ к значениям полей переменных:
    Код (C++):
    t1.hour ...
    t1.minute ...
    t1.second ...
     
    РусНекромант нравится это.
  12. Всем большое спасибо. Разобрался.