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

 
 
> Перебрать все члены структуры
Jenya7
сообщение May 25 2015, 07:09
Сообщение #1


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

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



я могу перебрать в итерации все члены массива.
Код
for (i=0; i < sizeof(array); i++)
{
    array[i] =i;
}


а можно сделать что то подобное со структурой или объединением?

Сообщение отредактировал Jenya7 - May 25 2015, 07:09
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 23)
jcxz
сообщение May 25 2015, 07:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Через массив указателей на члены.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 25 2015, 07:30
Сообщение #3


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

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



Цитата(jcxz @ May 25 2015, 12:19) *
Через массив указателей на члены.

это не генерик
под каждую структуру лепить массив указателей. что мы выигрываем?

Сообщение отредактировал Jenya7 - May 25 2015, 07:32
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 25 2015, 07:54
Сообщение #4


Универсальный солдатик
******

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



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

sizeof даст вам размер массива в байтах, а не количество членов.
А что можно сделать одинакового с членами структуры?
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 25 2015, 08:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

А что Вы хотите выиграть? Что такое "указатель на член структуры" знаете?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 25 2015, 09:03
Сообщение #6


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

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



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

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


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

член структуры можно проанализировать и в соответствии кто он принять решение.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 25 2015, 09:54
Сообщение #7


Универсальный солдатик
******

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



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

А как вы узнаете, какой это член? Работайте с каждым членом отдельной функцией. Или целиком со всей структурой, по элементам.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 25 2015, 10:45
Сообщение #8


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

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

было бы проще жить.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 25 2015, 10:59
Сообщение #9


Универсальный солдатик
******

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



Вам надо обратиться к C++ с его полиморфизмом.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 25 2015, 11:10
Сообщение #10


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

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



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

ну да. С++. с С# вообще горя бы не знал. sm.gif
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 25 2015, 13:15
Сообщение #11


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Во-первых, у вас не структура, а юнион. И в данном случае ВСЕ его члены одинаковые.

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 25 2015, 13:36
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ May 25 2015, 15:03) *
дайте пример.

Откройте любой учебник по си на описании операторов .* и ->*
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 25 2015, 13:49
Сообщение #13


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

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



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

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

так как мне выбрать член из юниона?
va_arg я реально не понял. посмотрел пару примеров...как то тяжко для моего мозга.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 25 2015, 14:32
Сообщение #14


Гуру
******

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



QUOTE (Jenya7 @ May 25 2015, 16:49) *
так как мне выбрать член из юниона?

Вы попробуйте для начала ПОНЯТЬ, что такое union. А там, глядишь, и поймете, что перебирать-то и нечего.
Дальше уже сможете рассказать, что хотите сделать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 25 2015, 14:54
Сообщение #15


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

Группа: Участник
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 25 2015, 22:00
Сообщение #16


Гуру
******

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



QUOTE (Jenya7 @ May 25 2015, 17:54) *
да я уже написал что хочу сделать.

Это не ЧТО, это КАК. Настоятельно рекомендую понять, что такое union.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 26 2015, 05:20
Сообщение #17


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

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



я заметил одну интересную особенность. если ответ на пост начинается с конструктивного примера/объяснения то все идет нормально. но если ответ начинается с умничания то все хана - слетаются умники и начинают соревноваться между собой.
вполне себе тема для научного изыскания. надо подбросить какому нибудь психологу.

Сообщение отредактировал Herz - May 26 2015, 18:35
Причина редактирования: Грубость
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 26 2015, 07:53
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ May 26 2015, 11:20) *
я заметил одну интересную особенность. если ответ на пост начинается с конструктивного примера/объяснения то все идет нормально. но если ответ начинается с умничания то все хана - слетаются умники и начинают соревноваться между собой.

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

PS: И чем Вас мой совет про указатели на члены структуры не устраивает?????
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 26 2015, 10:16
Сообщение #19


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

А чего именно указатели а не смещения offsetof() ?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 26 2015, 10:24
Сообщение #20


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

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



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

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

совет хороший но как его применить. у каждой команды есть своя функция и соответственно свой указатель. я ищу генерик метод подставить указатель по условию. я могу тупо перебрать их все но хочется как то красиво.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение May 26 2015, 11:18
Сообщение #21


Местный
***

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



Цитата(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]);
}

}


Сообщение отредактировал CrimsonPig - May 26 2015, 11:48
Go to the top of the page
 
+Quote Post
Jenya7
сообщение May 26 2015, 13:43
Сообщение #22


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

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



Цитата(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]);
}

}

спасибо. попробую разобраться.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 26 2015, 16:27
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Без разницы, можно и это. Только вряд-ли это поможет пациенту. Он упорно не хочет открывать учебник....
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jun 3 2015, 05:47
Сообщение #24


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Если хочется перебирать единообразно все злементы структуры... замените структуру на массив и перебирайте сколько душе угодно.
Go to the top of the page
 
+Quote Post

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

 


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


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