|
Структура указателей. |
|
|
|
May 3 2015, 07:23
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
У меня каждая команда принимаемая из терминала привязана к своей функции. Функции бывают разные - возвращающие значение, не возвращающие значение, с одним аргументом, двумя аргументами и так далее. Я решил собрать все мои функции в структуру и потом присваивать соответствующий указатель. Код typedef struct { void (*fp1)(void); void (*fp2)(uint32_t); void (*fp3)(uint32_t, uint32_t); void (*fp4)(uint32_t, uint32_t, uint32_t); uint32_t (*fp5)(uint32_t); uint32_t (*fp6)(uint32_t, uint32_t); uint32_t (*fp7)(uint32_t, uint32_t, uint32_t); //uint32_t (*fp5)(double x, double p[], double c); } fp;
struct command { char *name; //command name uint32_t minargs; uint32_t maxargs; uint32_t minval; uint32_t maxval; //uint32_t return_type; //void *varp; //return pointer to variable fp read_func_pointer; fp write_func_pointer; };
struct command commands[] = { {"gsm", 1, 2, 0, 0, ???? , ???? }, {"ifb", 0, 1, 0, 0, ????, ???? }, }; Не могу никак сообразить как мне подставить указатель в команду (там где вопросительные знаки).
|
|
|
|
|
 |
Ответов
|
May 4 2015, 09:59
|
Частый гость
 
Группа: Свой
Сообщений: 113
Регистрация: 25-10-07
Из: Краснодар
Пользователь №: 31 725

|
Можно сделать так CODE #include <stdint.h> #include <stdarg.h>
typedef uint32_t (*fp)(va_list ap);
// void (*fp1)(void); uint32_t fp1(va_list ap) { return 0; }
// void (*fp2)(uint32_t); uint32_t fp2(va_list ap) { uint32_t p1; p1 = va_arg(ap, uint32_t); return 0; }
// void (*fp3)(uint32_t, uint32_t); uint32_t fp3(va_list ap) { uint32_t p1, p2; p1 = va_arg(ap, uint32_t); p2 = va_arg(ap, uint32_t); return 0; }
// void (*fp4)(uint32_t, uint32_t, uint32_t); uint32_t fp4(va_list ap) { uint32_t p1, p2, p3; p1 = va_arg(ap, uint32_t); p2 = va_arg(ap, uint32_t); p3 = va_arg(ap, uint32_t); return 0; }
// uint32_t (*fp5)(uint32_t) uint32_t fp5(va_list ap) { uint32_t result = 0; uint32_t p1; p1 = va_arg(ap, uint32_t); result = p1 * p1; return result; }
// uint32_t (*fp6)(uint32_t, uint32_t); uint32_t fp6(va_list ap) { uint32_t result = 0; uint32_t p1, p2; p1 = va_arg(ap, uint32_t); p2 = va_arg(ap, uint32_t);
result = p1 * p2; return result; }
uint32_t exec(fp f, ...) { va_list ap; uint32_t result; va_start(ap, f); result = f(ap); va_end(ap); return result; }
struct command { char *name; //command name
fp read_func_pointer; fp write_func_pointer; };
struct command commands[] = { {"gsm", fp1, fp2 }, {"ifb", fp3, fp4 }, {"bdsm", fp5, fp6 }, };
int main() { int res; uint32_t p1 = 1, p2 = 2, p3 = 3; // void (*fp1)(void); exec(commands[0].read_func_pointer); // void (*fp2)(uint32_t); exec(commands[0].write_func_pointer, p1); // void (*fp3)(uint32_t, uint32_t); exec(commands[1].read_func_pointer, p1, p2); // void (*fp4)(uint32_t, uint32_t, uint32_t); exec(commands[1].write_func_pointer, p1, p2, p3); // uint32_t (*fp5)(uint32_t) res = exec(commands[2].read_func_pointer, p1); // uint32_t (*fp6)(uint32_t, uint32_t); res = exec(commands[2].write_func_pointer, p1, p2); return res; }
|
|
|
|
|
May 4 2015, 10:30
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(desh @ May 4 2015, 14:59)  Можно сделать так CODE #include <stdint.h> #include <stdarg.h>
typedef uint32_t (*fp)(va_list ap);
// void (*fp1)(void); uint32_t fp1(va_list ap) { return 0; }
// void (*fp2)(uint32_t); uint32_t fp2(va_list ap) { uint32_t p1; p1 = va_arg(ap, uint32_t); return 0; }
// void (*fp3)(uint32_t, uint32_t); uint32_t fp3(va_list ap) { uint32_t p1, p2; p1 = va_arg(ap, uint32_t); p2 = va_arg(ap, uint32_t); return 0; }
// void (*fp4)(uint32_t, uint32_t, uint32_t); uint32_t fp4(va_list ap) { uint32_t p1, p2, p3; p1 = va_arg(ap, uint32_t); p2 = va_arg(ap, uint32_t); p3 = va_arg(ap, uint32_t); return 0; }
// uint32_t (*fp5)(uint32_t) uint32_t fp5(va_list ap) { uint32_t result = 0; uint32_t p1; p1 = va_arg(ap, uint32_t); result = p1 * p1; return result; }
// uint32_t (*fp6)(uint32_t, uint32_t); uint32_t fp6(va_list ap) { uint32_t result = 0; uint32_t p1, p2; p1 = va_arg(ap, uint32_t); p2 = va_arg(ap, uint32_t);
result = p1 * p2; return result; }
uint32_t exec(fp f, ...) { va_list ap; uint32_t result; va_start(ap, f); result = f(ap); va_end(ap); return result; }
struct command { char *name; //command name
fp read_func_pointer; fp write_func_pointer; };
struct command commands[] = { {"gsm", fp1, fp2 }, {"ifb", fp3, fp4 }, {"bdsm", fp5, fp6 }, };
int main() { int res; uint32_t p1 = 1, p2 = 2, p3 = 3; // void (*fp1)(void); exec(commands[0].read_func_pointer); // void (*fp2)(uint32_t); exec(commands[0].write_func_pointer, p1); // void (*fp3)(uint32_t, uint32_t); exec(commands[1].read_func_pointer, p1, p2); // void (*fp4)(uint32_t, uint32_t, uint32_t); exec(commands[1].write_func_pointer, p1, p2, p3); // uint32_t (*fp5)(uint32_t) res = exec(commands[2].read_func_pointer, p1); // uint32_t (*fp6)(uint32_t, uint32_t); res = exec(commands[2].write_func_pointer, p1, p2); return res; }
а как определен va_list ?
|
|
|
|
Сообщений в этой теме
Jenya7 Структура указателей. May 3 2015, 07:23 psL Цитата(Jenya7 @ May 3 2015, 10:23) У меня... May 3 2015, 17:23 AHTOXA Цитата(psL @ May 3 2015, 22:23) в вашей з... May 3 2015, 19:01 Jenya7 Цитата(psL @ May 3 2015, 22:23) Как уже о... May 4 2015, 05:31  psL Цитата(Jenya7 @ May 4 2015, 08:31) то ест... May 4 2015, 19:12   Jenya7 Цитата(psL @ May 5 2015, 00:12) Для расши... May 5 2015, 05:15    psL Цитата(Jenya7 @ May 5 2015, 08:15) спасиб... May 5 2015, 06:21 desh Посмотрите в stdarg.h. Он не укусит May 4 2015, 10:37 Jenya7 Цитата(desh @ May 4 2015, 15:37) Посмотри... May 4 2015, 11:08  desh Цитата(Jenya7 @ May 4 2015, 14:08) даже н... May 4 2015, 12:49   Jenya7 Цитата(desh @ May 4 2015, 17:49) что то т... May 4 2015, 13:03 desh ну тогда для особых любителей третьей команды можн... May 4 2015, 13:10 Jenya7 Цитата(desh @ May 4 2015, 18:10) ну тогда... May 4 2015, 13:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|