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

|
Есть struct: Код typedef struct command { char *name; //command name char mode; //0-read, 1- read/write int minval; int maxval; void (*fp) (int com_num); //pointer to function void *vp; //pointer to variable }command;
command commands[] = { {"imax1", 1, 0, 10000, GetSetImax, &max_current1}, {"imax2", 1, 0, 10000, GetSetImax, &max_current2}, }; Я могу считать переменную Код UsartSendInt( (int)commands[com_num].vp ); Но записать не получается Код (int *)(commands[com_num].vp) = mux_cur; Что я делаю не так?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jul 14 2014, 10:29
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Как вам такой вариант: Код commands[com_num].vp = (void *)&mux_cur;
|
|
|
|
|
Jul 14 2014, 10:39
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(andrewlekar @ Jul 14 2014, 16:29)  Как вам такой вариант: Код commands[com_num].vp = (void *)&mux_cur; компайлер не ругается но я что то не понимаю - мы приводим к войд?
|
|
|
|
|
Jul 14 2014, 10:48
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата но я что то не понимаю - мы приводим к войд? Да, раз у вас в структуре хранится void *, то и приводите к void *. Потом обратно можно получить указатель на что угодно.
|
|
|
|
|
Jul 14 2014, 10:57
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(adnega @ Jul 14 2014, 16:43)  попробуйте *(int *)... = val вроде работет. спасибо. Цитата(andrewlekar @ Jul 14 2014, 16:48)  Да, раз у вас в структуре хранится void *, то и приводите к void *. Потом обратно можно получить указатель на что угодно. все рвно не понимаю - как он запишет инеджер в войд?
|
|
|
|
|
Jul 14 2014, 11:11
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата все рвно не понимаю - как он запишет инеджер в войд? Во-первых, он запишет указатель на интеджер в указатель на войд. Так делают, чтобы использовать одну структуру для разных данных (полиморфизм). Во-вторых, это вам надо выяснить, зачем вы в своей же структуре храните переменную как указатель на войд. Храните саму переменную как инт и всё будет проще.
|
|
|
|
|
Jul 14 2014, 11:21
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата у меня переменная может быть разной размерности В таком случае, если будете писать Код *(int *)... = val рискуете получить падающую программу.
|
|
|
|
|
Jul 14 2014, 11:31
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(andrewlekar @ Jul 14 2014, 17:21)  В таком случае, если будете писать Код *(int *)... = val рискуете получить падающую программу. ну если переменная скажем чар то я привожу к *(char *). по моему вполне безопасно.
Сообщение отредактировал Jenya7 - Jul 14 2014, 11:32
|
|
|
|
|
Jul 14 2014, 11:40
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(andrewlekar @ Jul 14 2014, 15:21)  В таком случае, если будете писать Код *(int *)... = val рискуете получить падающую программу. Поэтому нужно писать *(мой_сегодняшний_тип *)... = val А выше #typedef мой_сегодняшний_тип int. Компилятору не дается шанса найти ошибку и предупредить. Упасть может и в случае, если хранить указатель на int, но забыть его проинициализировать. И если ТС не подтянет знания по указателям, то и в многих других местах (заканчивая изощренными, типа, невыровненные данные). С другой стороны, указатель как правило 32-битный. Храните int и забудте о char, short.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|