Массив указателей на функции.

Массив указателей на функции.

Сообщение Addmin » 22 июн 2019, 21:53

Пример взял с гитхаба https://gist.github.com/dubkov/3b5d843e526fb54c91f0ce1d1e3051f1, проверен парсером Arduino IDE

Код: выделить все
// допустим, функций три. Заведем макрос с количеством функций,
// чтобы потом при смене количества было меньше ошибок
#define FUNC_NUM 3

// Напишем прототипы функций.
// Определения функций напишем потом внизу,
// чтобы они здесь не мозолили глаза
void f1(void);
void f2(void);
void f3(void);

// Теперь создадим три указателя
// и присвоим им адреса функций
void (*pf1)(void) = &f1;
void (*pf2)(void) = &f2;
void (*pf3)(void) = &f3;

// Прежде, чем сложить указатели в массив,
// нам придется создать для него тип.
// Вот мы создаем тип с названием FuncPtr
// который представляет собой указатель на функцию :)
typedef void (* FuncPtr) ();

// Теперь создадим массив длиной три
// и сложем в него указатели на функции.
// Массив имеет тип, который мы только что создали
FuncPtr funcArray[FUNC_NUM] = {pf1, pf2, pf3};

// Здесь всё понятно
void setup(){
   Serial.begin(19200);
}

// А это переменная - счетчик функций.
// Она должна инкрементироваться каждый раз,
// когда приходит единица в юарт
// (ну и сбрасываться в ноль когда надо)
int i = 0;

// Тут пока всё понятно
void loop(){
   if (Serial.available()){
      if (Serial.read() == '1'){
         // Обращаемся к текущему элементу массива,
         // тем самым делая вызов функции по очереди
         funcArray[i]();
         // Это тернарный оператор. Он проверяет на истинность
         // выражение после знака = и перед знаком ?.
         // если оно истинно, то переменной присваивается значение
         // после знака ?, если ложно - то значение после знака :.
         // здесь он нужен, чтобы листать индекс массива от 0 до
         // длины массива минус один. 
         i = (i < FUNC_NUM-1) ? i+1 : 0;


      }
   }
}

// А вот и описания функций.
// Они все вместе должны написать в порт
// интересное сообщение, когда ты пришлешь 3 единицы

void f1(){
   Serial.println("PACANI");
}

void f2(){
   Serial.println("VASCHE");
}

void f3(){
   Serial.println("REBYATA");
}
Addmin
Администратор
 
Сообщений: 43
Зарегистрирован: 24 июн 2017, 10:08

Вернуться в Arduino

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron