powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / исать читать члены структуры генерик способом. Язык C.
21 сообщений из 21, страница 1 из 1
исать читать члены структуры генерик способом. Язык C.
    #39492411
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть структура с разными данными
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
typedef struct MOTOR_DATA_S
{
    //run time
    uint32_t state;
    uint32_t dir;
    uint32_t speed;
    int32_t position;
    uint32_t current;
    uint32_t ovc;
    
    //hardware interface
    uint32_t lim_sw_fwd;
    uint32_t lim_sw_rev;
    uint32_t pwm_tim;
    uint32_t pwm_num;
    uint32_t fwd_pwm_chan;
    uint32_t rev_pwm_chan;
    uint32_t adc_chan;
    uint32_t enc_num; 
    uint32_t enc_type;
       
    //max limits
    uint32_t fwd_pwm_run;
    uint32_t rev_pwm_run;
    uint32_t fwd_max_pos;
    uint32_t rev_max_pos;
    uint32_t max_current;
    uint32_t max_ovc; 
     
    SPEED_PROFILE fwd_profile[MAX_PROFILES];
    SPEED_PROFILE rev_profile[MAX_PROFILES];
    TRAPEZ_PROFILE start_profile;
    TRAPEZ_PROFILE stop_profile;
    
} MOTOR_DATA;

MOTOR_DATA mot_data;



Я пишу читаю члены структуры посредством комманд пришедших с терминала. Ну например так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
uint32_t COM_Ovc(uint32_t argc, char** args)
{
    uint32_t arguments[argc];
    uint32_t addr_offset;
    
    if (GetIntArguments(argc, args, arguments) == MSG_OK)
    {
        if (ValidateArgument(arguments[0], 0, 0xFFFF))
        {
            if (argc >0)  // argument  - write
            {
                mot_data.max_ovc = arguments[0];
                EE_WriteVariable(EPR_ADR_OVC, arguments[0]);
            }
            else  //no argument - read
                Parser_SendInt(COM_USART, mot_data.max_ovc, 1, 0);
        }
        else
            return MSG_INV_ARG;
    }
    else
        return MSG_MIS_ARG;
    
    return MSG_OK;
}



В общем все команды одинаковы за исключением mot_data[arguments[0]-1].член_структуры. Получается одна переменная - одна функция.
Для того чтоб написать одну генерик функцию я думал создать указатель на член структуры
Код: plaintext
1.
2.
3.
4.
5.
6.
uint32_t *ptr;
ptr = &mot_data.max_ovc;
//write
*ptr = arguments[0];
//read
Parser_SendInt(COM_USART, *ptr, 1, 0);


и изменять только его в функции.
но тут возникает вопрос - получается мне нужна еще одна функция которая тупо переберет 20 (или сколько там членов структуры) кейсов и найдет на какой член структуры указывать.
как то получается довольно монструозно и не гибко.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492498
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7получается мне нужна еще одна функция которая тупо переберет 20 (или сколько там членов структуры) кейсов и найдет на какой член структуры указывать.
Нужна. Думаю по-другому никак не получится.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492509
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблицу со смещениями можно сгенерировать
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492542
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я ,s мог засунуть указатель в структуру принятой команды
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
typedef struct COMMAND_S
{
    char *name;  //command name
    uint32_t command_type;
    uint32_t minargs;
    uint32_t maxargs;
    uint32_t (*fp)(unsigned int, char **); //fuction poiner

    //это я добавляю
    uint32_t *vp; //variable pointer
}COMMAND;


я все равно инициализирую структуру команд. так я добавил бы указатель на переменную
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
COMMAND commands[] =
{
    [0] = { "stop",  0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL },
    [1] = { "start", 0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL },
    [2] = { "fwd",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL},
    [3] = { "rev",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL},
    [4] = { "mot",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL },
    [5] = { "pfb",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = &mot_data.pfb},
    [6] = { "ifb",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = &mot_data.ifb},
    [7] = { "ftop",  0, 1, MAX_ARGS, .fp = OneGlobFunc  .vp = &mot_data.fwd_max_pos },
    [8] = { "rtop",  0, 1, MAX_ARGS, .fp = OneGlobFunc  .vp = &mot_data.rev_max_pos}
};



ситуация несколько усложнилась. у меня мултиаксис поэтому массив структур mot_data[AXIS_NUM] . то есть мне надо инициализировать так
.vp = &mot_data[AXIS].pfb
проблема что AXIS передается аргументом в команде.

абсолютный адрес mot_data+(sizeof(mot_data)*array_index) + struct_member

то есть uint8_t *base_ptr = mot_data+(sizeof(mot_data)*array_index) - как мне динамически передать struct_member - base_ptr->struct_member
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492551
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7ситуация несколько усложнилась. у меня мултиаксис поэтому массив структур mot_data[AXIS_NUM] . то есть мне надо инициализировать так
.vp = &mot_data[AXIS].pfb
проблема что AXIS передается аргументом в команде.
Инициализируй указателем на первый элемент
Код: plaintext
1.
.vp = &mot_data[0].pfb


а при использовании смещайся на AXIS * sizeof(mot_data)
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492552
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть надо получить в ран тайм mot_data[индекс_пришел_из_команды].переменная_пришла_из_комманды

к примеру комманда - pfb 1 1000 => mot_data[1].pfb = 1000
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492553
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7ситуация несколько усложнилась. у меня мултиаксис поэтому массив структур mot_data[AXIS_NUM] . то есть мне надо инициализировать так
.vp = &mot_data[AXIS].pfb
проблема что AXIS передается аргументом в команде.
Инициализируй указателем на первый элемент
Код: plaintext
1.
.vp = &mot_data[0].pfb


а при использовании смещайся на AXIS * sizeof(mot_data)

а член структуры?
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492556
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7Dima Tпропущено...

Инициализируй указателем на первый элемент
Код: plaintext
1.
.vp = &mot_data[0].pfb


а при использовании смещайся на AXIS * sizeof(mot_data)

а член структуры?

ааа. понял. спасибо.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492557
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7jenya7пропущено...


а член структуры?

ааа. понял. спасибо.

несколько смущает привязка .vp = &mot_data[0].pfb. теряется гибкость.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492563
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7jenya7пропущено...


ааа. понял. спасибо.

несколько смущает привязка .vp = &mot_data[0].pfb. теряется гибкость.
pfd имеет свой offset в структуре. нельзя его прибавить? тупо приплюсовать
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492565
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7несколько смущает привязка .vp = &mot_data[0].pfb. теряется гибкость.
Я так понял гибкость не нужна. Если все-таки нужна, то пиши как изначально хотел.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492566
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7pfd имеет свой offset в структуре. нельзя его прибавить? тупо приплюсовать
можно.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492570
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7pfd имеет свой offset в структуре. нельзя его прибавить? тупо приплюсовать
можно.
а как тогда будет инициализация?
.vp = ????
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492628
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7Dima Tпропущено...

можно.
а как тогда будет инициализация?
.vp = ????

можно было наверно применить offset(структура, член) но я не уверен что offset коректно сработает в IAR.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492631
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7jenya7пропущено...

а как тогда будет инициализация?
.vp = ????

можно было наверно применить offset(структура, член) но я не уверен что offset коректно сработает в IAR.
то есть offsetof
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492654
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsetof() должен везде работать. Это часть С.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492655
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima Tпропущено...

можно.
а как тогда будет инициализация?
.vp = ????
vp должен иметь тип size_t и туда писать что вернет offsetof()
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492662
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7пропущено...

а как тогда будет инициализация?
.vp = ????
vp должен иметь тип size_t и туда писать что вернет offsetof()
а он возвращает количество байт от начала? если да то должно быть
uint8_t *ptr = mot_data+(sizeof(mot_data)*array_index) + vp
так как sizeof это количество байт.
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492666
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima Tпропущено...

vp должен иметь тип size_t и туда писать что вернет offsetof()
а он возвращает количество байт от начала? если да то должно быть
uint8_t *ptr = mot_data+(sizeof(mot_data)*array_index) + vp
так как sizeof это количество байт.
Теоретически все правильно, на практике проверять некогда. Затести.
Я бы явное приведение типов добавил
Код: plaintext
1.
uint8_t *ptr = (uint8_t *)mot_data+(sizeof(mot_data)*array_index) + vp 
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492804
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дженерики в С реализуются только макросами
...
Рейтинг: 0 / 0
исать читать члены структуры генерик способом. Язык C.
    #39492937
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7пропущено...

а он возвращает количество байт от начала? если да то должно быть
uint8_t *ptr = mot_data+(sizeof(mot_data)*array_index) + vp
так как sizeof это количество байт.
Теоретически все правильно, на практике проверять некогда. Затести.
Я бы явное приведение типов добавил
Код: plaintext
1.
uint8_t *ptr = (uint8_t *)mot_data+(sizeof(mot_data)*array_index) + vp 


спасибо.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / исать читать члены структуры генерик способом. Язык C.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]