|
2 страниц
1 2 >
|
 |
Ответов
(1 - 23)
|
May 25 2015, 07:54
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Jenya7 @ May 25 2015, 10:09)  я могу перебрать в итерации все члены массива. Код for (i=0; i < sizeof(array); i++) { array[i] =i; } sizeof даст вам размер массива в байтах, а не количество членов. А что можно сделать одинакового с членами структуры?
|
|
|
|
|
May 25 2015, 09:03
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(jcxz @ May 25 2015, 13:59)  А что Вы хотите выиграть? Что такое "указатель на член структуры" знаете? дайте пример. Цитата(ViKo @ May 25 2015, 12:54)  sizeof даст вам размер массива в байтах, а не количество членов. А что можно сделать одинакового с членами структуры? член структуры можно проанализировать и в соответствии кто он принять решение.
|
|
|
|
|
May 25 2015, 10:45
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(ViKo @ May 25 2015, 14:54)  А как вы узнаете, какой это член? Работайте с каждым членом отдельной функцией. Или целиком со всей структурой, по элементам. отдельной функцией, куча функций надо писать. хочется кратко и элегантно. ну к примеру Код typedef union { void (*fp1p)(void); void (*fp2p)(uint32_t); void (*fp3p)(uint32_t, uint32_t); void (*fp4p)(uint32_t, uint32_t, uint32_t); uint32_t (*fp5p)(uint32_t); uint32_t (*fp6p)(uint32_t, uint32_t); uint32_t (*fp7p)(uint32_t, uint32_t, uint32_t); } fp;
struct command { char *name; //command name uint32_t minargs; uint32_t maxargs; int minval; int maxval; fp read_func_pointer; fp write_func_pointer; }; если бы я мог написать Код if(arg_count == 0) { uint32_t ret_val = commands[0].read_func_pointer[i]; } else { commands[0]. write_func_pointer[j]; } было бы проще жить.
|
|
|
|
|
May 25 2015, 14:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Jenya7 @ May 25 2015, 16:49)  так как мне выбрать член из юниона? Вы попробуйте для начала ПОНЯТЬ, что такое union. А там, глядишь, и поймете, что перебирать-то и нечего. Дальше уже сможете рассказать, что хотите сделать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 25 2015, 14:54
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(zltigo @ May 25 2015, 19:32)  Вы попробуйте для начала ПОНЯТЬ, что такое union. А там, глядишь, и поймете, что перебирать-то и нечего. Дальше уже сможете рассказать, что хотите сделать. да я уже написал что хочу сделать. Код if(arg_count == 0) { uint32_t ret_val = commands[0].read_func_pointer[i](arg1); } else { commands[0]. write_func_pointer[j](arg1, arg2); }
|
|
|
|
|
May 26 2015, 11:18
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ May 26 2015, 11:24)  совет хороший но как его применить. у каждой команды есть своя функция и соответственно свой указатель. я ищу генерик метод подставить указатель по условию. я могу тупо перебрать их все но хочется как то красиво. "Сделайте мне красиво"  Вот вам в качестве примера кривая реализация функторов на сях. Может подвигнет к размышлениям (а может к очередной порции страданий, что опять все плохо...). CODE //-- pointer to function that performs concrete command processing
struct TCommandFunctor; typedef int (*PF_CmdProcessor) (const TCommandFunctor* apFunctor);
//-- command functor. encapsulated parameters and a pointer to processing function struct TCommandFunctor { uint32 arg1; uint32 arg2; uint8 arg3; uint16 arg4;
PF_CmdProcessor pCmdProcessor; };
int DoCallFunctor(const TCommandFunctor* apFunctor) { return apFunctor->pCmdProcessor(apFunctor); }
//-- define command processor functions
int ProcessCmd1(const TCommandFunctor* apFunctor) { uint32 res1 = apFunctor->arg1 + apFunctor->arg2; return (res1 > 733); }
int ProcessCmd2(const TCommandFunctor* apFunctor) { //-- do something else uint32 res1 = apFunctor->arg3 > apFunctor->arg1; return res1; }
//-- define and populate functors TCommandFunctor cmdFunctors[2] = { {1, 2, 3, 4, ProcessCmd1}, {11,22,23,24, ProcessCmd2} };
void DoWhatever() { for(int i=0; i<2; ++i) { DoCallFunctor(&cmdFunctors[i]); }
}
Сообщение отредактировал CrimsonPig - May 26 2015, 11:48
|
|
|
|
|
May 26 2015, 13:43
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(CrimsonPig @ May 26 2015, 16:18)  "Сделайте мне красиво"  Вот вам в качестве примера кривая реализация функторов на сях. Может подвигнет к размышлениям (а может к очередной порции страданий, что опять все плохо...). CODE //-- pointer to function that performs concrete command processing
struct TCommandFunctor; typedef int (*PF_CmdProcessor) (const TCommandFunctor* apFunctor);
//-- command functor. encapsulated parameters and a pointer to processing function struct TCommandFunctor { uint32 arg1; uint32 arg2; uint8 arg3; uint16 arg4;
PF_CmdProcessor pCmdProcessor; };
int DoCallFunctor(const TCommandFunctor* apFunctor) { return apFunctor->pCmdProcessor(apFunctor); }
//-- define command processor functions
int ProcessCmd1(const TCommandFunctor* apFunctor) { uint32 res1 = apFunctor->arg1 + apFunctor->arg2; return (res1 > 733); }
int ProcessCmd2(const TCommandFunctor* apFunctor) { //-- do something else uint32 res1 = apFunctor->arg3 > apFunctor->arg1; return res1; }
//-- define and populate functors TCommandFunctor cmdFunctors[2] = { {1, 2, 3, 4, ProcessCmd1}, {11,22,23,24, ProcessCmd2} };
void DoWhatever() { for(int i=0; i<2; ++i) { DoCallFunctor(&cmdFunctors[i]); }
}
спасибо. попробую разобраться.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|