Страница 1 из 1
Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 08:54:13
spongebob
Можно ли хранить указатели на функцию в массиве и вызывать функцию по номеру элемента в массиве?
например, есть функции a1(), a2(), a3()
и массив mas из трёх элементов
и в зависимости от того, к какому элементу массива мы обращаемся - вызывать определенную функцию
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 09:57:47
ARV
язык Си это не запрещает - делайте и пользуйтесь.
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 10:10:00
spongebob
а как?
можно пример кода?
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 10:23:26
ARV
Код: Выделить всё
typedef void (*func_ptr)(void); // описали тип "указатель на функцию"
// определили функции
static void f1(void){
...
}
static void f2(void){
...
}
// определили массив из указателей на эти функции
static func_ptr farr[2] = {f1, f2};
// пользуемся
farr[0](); // вызываем ф-ю f1
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 10:37:03
spongebob
огромное спасибо!
а если нужно параметр передать функции?
static void f2( параметр ){
...
}
farr[0](параметр)?
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 10:48:31
ARV
тип и параметры функции у вас обязаны совпадать с типом указателя. нужны функции с параметром - изменяйте typedef соответствующим образом, например для 1-го параметра типа int будет так:
ни в коем случае не пихайте в массив "несовместимые" по типу и параметрам функции! по правилам Си вы получите
только предупреждение, проект скомпилируется, но последствия будут печальными...
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 10:54:14
spongebob
мне нужно передать ТОЛЬКО unsigned char
несколько разных функций, но все они получают только один unsigned char
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 11:25:02
spongebob
Код: Выделить всё
typedef void (*func_ptr)(void); // описали тип "указатель на функцию"
static void nf(unsigned char x){}
static void fu(unsigned char x){}
static void fd(unsigned char x){}
static void fl(unsigned char x){}
static void fr(unsigned char x){}
static func_ptr farr[4] = {fu(0),fd(0),fl(0),fr(0)};
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.82
Error at file ../mn.c line 22 column 33: (188) constant expression required
Error at file ../mn.c line 22 column 33: (206) illegal use of void expression
Error at file ../mn.c line 22 column 33: (182) illegal conversion between types
??? -> pointer to function with no arguments returning ???
Error at file ../mn.c line 22 column 33: (181) non-scalar types can't be converted to other types
Error at file ../mn.c line 22 column 39: (188) constant expression required
make: *** [mn.p1] Error 1
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 11:29:33
ARV
давайте поиграем в "найди 10 отличий"
прочтите еще раз мои посты, нет, 2 раза прочтите каждый, а потом займитесь сравнением того, что наделали вы и того, что советовал я.
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 11:37:27
spongebob
отличие одно нашёл.
typedef void (*func_ptr)(unsigned char); - исправил
(0) убрал - это ж указатель, а не функция. параметр же указывается дальше в коде...
п.с. я обучаемый малый, меня только подпнуть в верном направлении надо...
Re: Указатели на функцию в массиве
Добавлено: Ср июл 15, 2015 12:20:41
ARV
spongebob писал(а):п.с. я обучаемый малый, меня только подпнуть в верном направлении надо...
рискуете нарваться на желающих запинать из добрых побуждений

Re: Указатели на функцию в массиве
Добавлено: Вт июл 21, 2015 16:21:35
shindax
ARV писал(а):spongebob писал(а):п.с. я обучаемый малый, меня только подпнуть в верном направлении надо...
рискуете нарваться на желающих запинать из добрых побуждений

+100.
2spongebob. Что это Ваше означает?:
Код: Выделить всё
...
static func_ptr farr[4] = {fu(0),fd(0),fl(0),fr(0)};
...
Вам нужно указатели в массив прописать, т.е:
Код: Выделить всё
...
static func_ptr farr[4] = {fu,fd,fl,fr};
...
А аргументы уже при вызове указывать:
Код: Выделить всё
...
// пользуемся
farr[0](0); // вызываем ф-ю fu с аргументом "0"
Если количество и тип аргументов будет разным, то тоже есть стандартный ход - передать два аргумента: Первый - их количество, второй - указатель на массив ( массив структур ) аргументов, либо просто идентификатор типа аргумента + указатель. Логику парсинга аргументов можно придумать любую.
Re: Указатели на функцию в массиве
Добавлено: Ср июл 22, 2015 14:23:08
spongebob
как жаль что вас с нами небыло
вопрос исчерпан уже