|
Работа со 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; Что я делаю не так?
|
|
|
|
|
 |
Ответов
|
Jul 14 2014, 11:21
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата у меня переменная может быть разной размерности В таком случае, если будете писать Код *(int *)... = val рискуете получить падающую программу.
|
|
|
|
|
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.
|
|
|
|
|
Jul 14 2014, 11:50
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jul 14 2014, 15:44)  то есть лучше писать * (uint32_t *) ? Типа того. Раз и на всегда приняв для себя, что "храню 32-битное беззнаковое число". И если не нужно обращение именно по указателю, то храните само число (как советовал andrewlekar), хоть в том же uint32_t. Ведь указатель Вы использовали, чтоб при необходимости использовать char, short, int и т.п?
|
|
|
|
Сообщений в этой теме
Jenya7 Работа со struct Jul 14 2014, 10:13 andrewlekar Как вам такой вариант:
Кодcommands[com_num... Jul 14 2014, 10:29 Jenya7 Цитата(andrewlekar @ Jul 14 2014, 16:29) ... Jul 14 2014, 10:39  adnega попробуйте *(int *)... = val Jul 14 2014, 10:43   Jenya7 Цитата(adnega @ Jul 14 2014, 16:43) попро... Jul 14 2014, 10:57    mempfis_ Цитата(Jenya7 @ Jul 14 2014, 13:57) все р... Jul 14 2014, 11:13 andrewlekar Цитатано я что то не понимаю - мы приводим к войд?... Jul 14 2014, 10:48 andrewlekar Цитатавсе рвно не понимаю - как он запишет инеджер... Jul 14 2014, 11:11 Jenya7 Цитата(andrewlekar @ Jul 14 2014, 17:11) ... Jul 14 2014, 11:19 Jenya7 Цитата(andrewlekar @ Jul 14 2014, 17:21) ... Jul 14 2014, 11:31  Jenya7 Цитата(adnega @ Jul 14 2014, 17:40) С дру... Jul 14 2014, 11:45 andrewlekar uint32_t vp; Jul 14 2014, 11:45 Jenya7 спасибо всем. Jul 14 2014, 12:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|