реклама на сайте
подробности

 
 
> Структура указателей.
Jenya7
сообщение May 3 2015, 07:23
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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,  ????, ???? },
    
};

Не могу никак сообразить как мне подставить указатель в команду (там где вопросительные знаки).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
desh
сообщение May 4 2015, 09:59
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 4 2015, 10:30
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 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 ?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 14:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016