Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перебрать все члены структуры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
я могу перебрать в итерации все члены массива.
Код
for (i=0; i < sizeof(array); i++)
{
    array[i] =i;
}


а можно сделать что то подобное со структурой или объединением?
jcxz
Через массив указателей на члены.
Jenya7
Цитата(jcxz @ May 25 2015, 12:19) *
Через массив указателей на члены.

это не генерик
под каждую структуру лепить массив указателей. что мы выигрываем?
ViKo
Цитата(Jenya7 @ May 25 2015, 10:09) *
я могу перебрать в итерации все члены массива.
Код
for (i=0; i < sizeof(array); i++)
{
    array[i] =i;
}

sizeof даст вам размер массива в байтах, а не количество членов.
А что можно сделать одинакового с членами структуры?
jcxz
Цитата(Jenya7 @ May 25 2015, 13:30) *
это не генерик
под каждую структуру лепить массив указателей. что мы выигрываем?

А что Вы хотите выиграть? Что такое "указатель на член структуры" знаете?
Jenya7
Цитата(jcxz @ May 25 2015, 13:59) *
А что Вы хотите выиграть? Что такое "указатель на член структуры" знаете?

дайте пример.


Цитата(ViKo @ May 25 2015, 12:54) *
sizeof даст вам размер массива в байтах, а не количество членов.
А что можно сделать одинакового с членами структуры?

член структуры можно проанализировать и в соответствии кто он принять решение.
ViKo
Цитата(Jenya7 @ May 25 2015, 12:03) *
член структуры можно проанализировать и в соответствии кто он принять решение.

А как вы узнаете, какой это член? Работайте с каждым членом отдельной функцией. Или целиком со всей структурой, по элементам.
Jenya7
Цитата(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];
}

было бы проще жить.
ViKo
Вам надо обратиться к C++ с его полиморфизмом.
Jenya7
Цитата(ViKo @ May 25 2015, 15:59) *
Вам надо обратиться к C++ с его полиморфизмом.

ну да. С++. с С# вообще горя бы не знал. sm.gif
esaulenka
Во-первых, у вас не структура, а юнион. И в данном случае ВСЕ его члены одинаковые.

А во-вторых, предлагаю крепко погуглить VA_ARGS.
jcxz
Цитата(Jenya7 @ May 25 2015, 15:03) *
дайте пример.

Откройте любой учебник по си на описании операторов .* и ->*
Jenya7
Цитата(esaulenka @ May 25 2015, 18:15) *
Во-первых, у вас не структура, а юнион. И в данном случае ВСЕ его члены одинаковые.

А во-вторых, предлагаю крепко погуглить VA_ARGS.

так как мне выбрать член из юниона?
va_arg я реально не понял. посмотрел пару примеров...как то тяжко для моего мозга.
zltigo
QUOTE (Jenya7 @ May 25 2015, 16:49) *
так как мне выбрать член из юниона?

Вы попробуйте для начала ПОНЯТЬ, что такое union. А там, глядишь, и поймете, что перебирать-то и нечего.
Дальше уже сможете рассказать, что хотите сделать.
Jenya7
Цитата(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);
}
zltigo
QUOTE (Jenya7 @ May 25 2015, 17:54) *
да я уже написал что хочу сделать.

Это не ЧТО, это КАК. Настоятельно рекомендую понять, что такое union.
Jenya7
я заметил одну интересную особенность. если ответ на пост начинается с конструктивного примера/объяснения то все идет нормально. но если ответ начинается с умничания то все хана - слетаются умники и начинают соревноваться между собой.
вполне себе тема для научного изыскания. надо подбросить какому нибудь психологу.
jcxz
Цитата(Jenya7 @ May 26 2015, 11:20) *
я заметил одну интересную особенность. если ответ на пост начинается с конструктивного примера/объяснения то все идет нормально. но если ответ начинается с умничания то все хана - слетаются умники и начинают соревноваться между собой.

Вы путаете причину со следствием. Если вопрос осмысленный и корректный, то и ответы на него такие-же (и первый и последующие).
На глупый вопрос можно отвечать или так-же глупо или никак.

PS: И чем Вас мой совет про указатели на члены структуры не устраивает?????
_Pasha
Цитата(jcxz @ May 26 2015, 10:53) *
И чем Вас мой совет про указатели на члены структуры не устраивает?????

А чего именно указатели а не смещения offsetof() ?
Jenya7
Цитата(jcxz @ May 26 2015, 12:53) *
Вы путаете причину со следствием. Если вопрос осмысленный и корректный, то и ответы на него такие-же (и первый и последующие).
На глупый вопрос можно отвечать или так-же глупо или никак.

PS: И чем Вас мой совет про указатели на члены структуры не устраивает?????

совет хороший но как его применить. у каждой команды есть своя функция и соответственно свой указатель. я ищу генерик метод подставить указатель по условию. я могу тупо перебрать их все но хочется как то красиво.
CrimsonPig
Цитата(Jenya7 @ May 26 2015, 11:24) *
совет хороший но как его применить. у каждой команды есть своя функция и соответственно свой указатель. я ищу генерик метод подставить указатель по условию. я могу тупо перебрать их все но хочется как то красиво.


"Сделайте мне красиво" sm.gif
Вот вам в качестве примера кривая реализация функторов на сях. Может подвигнет к размышлениям (а может к очередной порции страданий, что опять все плохо...).

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]);
}

}
Jenya7
Цитата(CrimsonPig @ May 26 2015, 16:18) *
"Сделайте мне красиво" sm.gif
Вот вам в качестве примера кривая реализация функторов на сях. Может подвигнет к размышлениям (а может к очередной порции страданий, что опять все плохо...).

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]);
}

}

спасибо. попробую разобраться.
jcxz
Цитата(_Pasha @ May 26 2015, 16:16) *
А чего именно указатели а не смещения offsetof() ?

Без разницы, можно и это. Только вряд-ли это поможет пациенту. Он упорно не хочет открывать учебник....
ar__systems
Если хочется перебирать единообразно все злементы структуры... замените структуру на массив и перебирайте сколько душе угодно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.