jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба Есть 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; Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба Как вам такой вариант: commands[com_num].vp = (void *)&mux_cur; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба Как вам такой вариант: commands[com_num].vp = (void *)&mux_cur; компайлер не ругается но я что то не понимаю - мы приводим к войд? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба попробуйте *(int *)... = val Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба но я что то не понимаю - мы приводим к войд? Да, раз у вас в структуре хранится void *, то и приводите к void *. Потом обратно можно получить указатель на что угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба попробуйте *(int *)... = val вроде работет. спасибо. Да, раз у вас в структуре хранится void *, то и приводите к void *. Потом обратно можно получить указатель на что угодно. все рвно не понимаю - как он запишет инеджер в войд? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба все рвно не понимаю - как он запишет инеджер в войд? Во-первых, он запишет указатель на интеджер в указатель на войд. Так делают, чтобы использовать одну структуру для разных данных (полиморфизм). Во-вторых, это вам надо выяснить, зачем вы в своей же структуре храните переменную как указатель на войд. Храните саму переменную как инт и всё будет проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба все рвно не понимаю - как он запишет инеджер в войд? int*, char*, short*, void* и вообще любой указатель - это просто число. Адрес переменной. int или char определяют сколько байт нужно считать при обращении к переменной. А void* получается пустой указатель. т.е. указатель на переменную без привязки к её типу (разрядности). Чтоб корректно считать данные при чтении вы должны привести его к одному из существующих типов - int*, char* и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба Во-первых, он запишет указатель на интеджер в указатель на войд. Так делают, чтобы использовать одну структуру для разных данных (полиморфизм). Во-вторых, это вам надо выяснить, зачем вы в своей же структуре храните переменную как указатель на войд. Храните саму переменную как инт и всё будет проще. у меня переменная может быть разной размерности - поэтому указатель на войд, чтоб потом привести к нужному типу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба у меня переменная может быть разной размерности В таком случае, если будете писать *(int *)... = val рискуете получить падающую программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 (изменено) · Жалоба В таком случае, если будете писать *(int *)... = val рискуете получить падающую программу. ну если переменная скажем чар то я привожу к *(char *). по моему вполне безопасно. Изменено 14 июля, 2014 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба В таком случае, если будете писать *(int *)... = val рискуете получить падающую программу. Поэтому нужно писать *(мой_сегодняшний_тип *)... = val А выше #typedef мой_сегодняшний_тип int. Компилятору не дается шанса найти ошибку и предупредить. Упасть может и в случае, если хранить указатель на int, но забыть его проинициализировать. И если ТС не подтянет знания по указателям, то и в многих других местах (заканчивая изощренными, типа, невыровненные данные). С другой стороны, указатель как правило 32-битный. Храните int и забудте о char, short. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба Поэтому нужно писать *(мой_сегодняшний_тип *)... = val А выше #typedef мой_сегодняшний_тип int. Компилятору не дается шанса найти ошибку и предупредить. Упасть может и в случае, если хранить указатель на int, но забыть его проинициализировать. И если ТС не подтянет знания по указателям, то и в многих других местах (заканчивая изощренными, типа, невыровненные данные). С другой стороны, указатель как правило 32-битный. Храните int и забудте о char, short. то есть лучше писать * (uint32_t *) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба uint32_t vp; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 14 июля, 2014 Опубликовано 14 июля, 2014 · Жалоба С другой стороны, указатель как правило 32-битный. Храните int и забудте о char, short. по моему это лучший способ избежать головной боли. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться