Указатели на функцию в массиве

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Указатели на функцию в массиве

Сообщение spongebob »

Можно ли хранить указатели на функцию в массиве и вызывать функцию по номеру элемента в массиве?

например, есть функции a1(), a2(), a3()
и массив mas из трёх элементов
и в зависимости от того, к какому элементу массива мы обращаемся - вызывать определенную функцию
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение ARV »

язык Си это не запрещает - делайте и пользуйтесь.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение spongebob »

а как?

можно пример кода?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение ARV »

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

typedef void (*func_ptr)(void); // описали тип "указатель на функцию"

// определили функции
static void f1(void){
   ...
}

static void f2(void){
   ...
}

// определили массив из указателей на эти функции
static func_ptr farr[2] = {f1, f2};

// пользуемся
farr[0](); // вызываем ф-ю f1
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение spongebob »

огромное спасибо!

а если нужно параметр передать функции?
static void f2( параметр ){
...
}

farr[0](параметр)?
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение ARV »

тип и параметры функции у вас обязаны совпадать с типом указателя. нужны функции с параметром - изменяйте typedef соответствующим образом, например для 1-го параметра типа int будет так:

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

typedef void (*func_ptr)(int);
ни в коем случае не пихайте в массив "несовместимые" по типу и параметрам функции! по правилам Си вы получите только предупреждение, проект скомпилируется, но последствия будут печальными...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение spongebob »

мне нужно передать ТОЛЬКО unsigned char
несколько разных функций, но все они получают только один unsigned char
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение 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
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение ARV »

давайте поиграем в "найди 10 отличий" :)))

прочтите еще раз мои посты, нет, 2 раза прочтите каждый, а потом займитесь сравнением того, что наделали вы и того, что советовал я.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение spongebob »

отличие одно нашёл.
typedef void (*func_ptr)(unsigned char); - исправил
(0) убрал - это ж указатель, а не функция. параметр же указывается дальше в коде...

п.с. я обучаемый малый, меня только подпнуть в верном направлении надо...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение ARV »

spongebob писал(а):п.с. я обучаемый малый, меня только подпнуть в верном направлении надо...
рискуете нарваться на желающих запинать из добрых побуждений :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Указатели на функцию в массиве

Сообщение 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"
Если количество и тип аргументов будет разным, то тоже есть стандартный ход - передать два аргумента: Первый - их количество, второй - указатель на массив ( массив структур ) аргументов, либо просто идентификатор типа аргумента + указатель. Логику парсинга аргументов можно придумать любую.
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Указатели на функцию в массиве

Сообщение spongebob »

как жаль что вас с нами небыло
вопрос исчерпан уже
Ответить

Вернуться в «PIC»