Можно ли создать массив для функций?
Допустим, я хочу создать 10 функций с именем Function1, Function2 до 10. Каждая функция используется, если определенная переменная равна ее номеру. Вместо того чтобы использовать отдельные функции, мне было интересно, можно ли использовать какую-то концепцию массива для функций, когда дело доходит до именования? Я пробовал читать об этом и видел указатели, но, честно говоря, не понимал, что я видел об этом, потому что я еще не настолько хорошо разбираюсь в этом языке.
@AndroidV11, 👍1
Обсуждение1 ответ
Вот пример того, как это сделать:
jump_table.ino
int func1(int arg) { return arg + 1; }
int func2(int arg) { return arg + 2; }
int func3(int arg) { return arg + 3; }
int func4(int arg) { return arg + 4; }
int func5(int arg) { return arg + 5; }
int func6(int arg) { return arg + 6; }
int func7(int arg) { return arg + 7; }
int func8(int arg) { return arg + 8; }
int func9(int arg) { return arg + 9; }
int func10(int arg) { return arg + 10; }
int (*jump_table[10])(int) = { func1, func2, func3, func4, func5,
func6, func7, func8, func9, func10 };
void setup() {
}
void loop() {
int index = 2;
int argument = 42;
int result = (*jump_table[index])(argument);
// результат - 45
}
Все функции, хранящиеся в массиве, должны иметь одинаковую сигнатуру. Это просто означает, что они должны возвращать один и тот же тип (например, int
) и иметь одни и те же аргументы (один int
в приведенном выше примере).
То же самое можно сделать и со статическими методами класса (но не с методами экземпляра). Например, вы можете использовать MyClass::myStaticMethod
в приведенном выше массиве, но не MyClass::myInstanceMethod и
не instance.myInstanceMethod
:
class MyClass {
public:
static int myStaticMethod(int foo) { return foo + 17; }
int myInstanceMethod(int bar) { return bar + 17; }
}
MyClass instance;
Похожий вопрос есть и в stackoverflow.
Привет, разве аргумент отличается от аргумента arg? Но похоже, что ваш код верен., @AndroidV11
@AndroidV11 Значение argument
передается соответствующей функции, где оно доступно как arg
(или foo
в примере класса). Кстати, судя по вашему комментарию, вы довольно новичок в программировании. Если это так, то я бы рекомендовал подробнее изучить основы C++, прежде чем использовать эту технику; она довольно продвинута и действительно имеет смысл использовать только в специализированных ситуациях (например, обработчики удаленных вызовов процедур)., @Alex Hajnal
@AndroidV11 Я только что исправил довольно неприятную опечатку в коде. C++ использует индексы массива на основе нуля, поэтому для вызова третьей функции "индекс" должен быть равен "2", а не "3"., @Alex Hajnal
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Ошибка получения адреса временного массива при передаче массива составных литералов
- Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'
- Как удалить элемент из массива arduino?
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Как вернуть значение массива символов в функции Arduino IDE?
- Установка указателя массива на null при объявлении
- Вычислить размер массива, который был передан в качестве параметра функции
Конечно, это возможно, вы можете сделать массив любого типа данных, который вам нравится. А указатель на функцию-это тип данных. Но это широкий вопрос, поэтому вы скорее получите хорошую книгу или онлайн-ресурс на C++ и начнете учиться., @the busybee