Arduino func array
// допустим, функций три. Заведем макрос с количеством функций, | |
// чтобы потом при смене количества было меньше ошибок | |
#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"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment