Страница 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 будет так:

Код: Выделить всё

typedef void (*func_ptr)(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
как жаль что вас с нами небыло
вопрос исчерпан уже