sidy 1 28 января, 2016 Опубликовано 28 января, 2016 · Жалоба Всем добра. Достался в наследие чужой код. Необходимо его привести в удобо-варимый вид. Есть куски, которые повторяются по несколько раз, только с разными переменными. Хотел заменить эти места функциями, но вот проблема, используются переменные в виде структур с битовыми полями типа: system.onoff и не получаются по указателю передать такие переменные в функцию, поскольку у структур адрес имеется, а у битового поля его нет. Вопрос как обычно поступают в таких случаях? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 28 января, 2016 Опубликовано 28 января, 2016 · Жалоба Разумеетя передают указатель на стуктуру Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 28 января, 2016 Опубликовано 28 января, 2016 · Жалоба Разумеетя передают указатель на стуктуру Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 января, 2016 Опубликовано 28 января, 2016 · Жалоба Если структура глобальная, то и передавать не надо. И так известно. Я так делаю. Если надо в функцию передать битовое поле, параметр функции задаю как int (иногда bool), а передаю значение поля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 28 января, 2016 Опубликовано 28 января, 2016 (изменено) · Жалоба Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1? Примерно так struct FlashProg_t { uint8_t ind; uint8_t desc; uint8_t __code *descriptor; uint8_t (*flInit)(void); uint8_t (*flUnProtect)(void); uint8_t (*flRead)(void); uint8_t (*flErase)(void); uint8_t (*flWrite)(void); uint8_t (*flVerify)(void); uint8_t (*flProtect)(void); uint8_t (*flExit)(void); }; void printFlashHelp(void) { uint8_t i; __code struct FlashProg_t* Fun; union { uint8_t *a8; uint16_t *a16; uint16_t d16; } aFun; printf("\n\r"); printf(" H - HELP\n"); aFun.d16 = FUNCROM; for(i=0; i < MAX_USER_PROGRAM; i++) { // printf("Check adr %04X %04X\n",aFun.d16,*aFun.a16); Fun = (__code struct FlashProg_t*)(*aFun.a16); if(*aFun.a8 != 0xFF) { printf("%c - %s\n",Fun->ind,Fun->descriptor); }; aFun.a8 += 3; } printf(" Q - QUIT\n"); } Через Fun->descriptor . Изменено 3 февраля, 2016 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Раньше была структура с битовыми полями и чтобы изменить в ней бит накладывалась маска. struct{ enable1 :1; enable2 :1; enable3 :1; enable4 :1; enable5 :1; enable6 :1; enable7 :1; enable8 :1; disable1 :1; disable2 :1: disable3 :1: disable4 :1: disable5 :1: disable6 :1: disable7 :1: disable8 :1: } blockcontrol; Теперь необходимо использовать массив структур из битовых полей: struct{ enable :1; disable :1; } blockcontrol[8]; поэтому возник вопрос как теперь накладывать маску что изменить, например бит blockcontrol[5].enable? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Раньше была структура с битовыми полями и чтобы изменить в ней бит накладывалась маска. Какая такая маска??? Вы вообще о чем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Какая такая маска??? Вы вообще о чем? Да эти дятлы, небось делали следущее: blockcontrol control; ((uint16)control) |= 0x00010002; if(control.enable5) {...} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Да эти дятлы, небось делали следущее: blockcontrol control; ((uint16)control) |= 0x00010002; if(control.enable5) {...} Да было сделано примерно так. Вот теперь разгребаю, мучаюсь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба А теперь не нужно накладывать маску. Теперь каждая ваша структура занимает ровно один байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Да было сделано примерно так. Вот теперь разгребаю, мучаюсь... struct{ uint8_t enable :1; uint8_t disable :1; } blockcontrol[8]; if( !blockcontrol[5].disable ) blockcontrol[5].enable = TRUE; И Вы, это самое..... почитайте что-нибудь хотя-бы их самых языковых основ а то как бы из "разгребания" не получилось перемешивание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Слыхал я, что стандартом не гарантировано, что биты битового поля непременно должны быть представлены в памяти именно битами. Так нагло накладывать маску - это вообще за гранью моего понимания! Я бы даже такого не придумал никогда наверно)) Слава Богу компиляторы делают адекватные люди и UB часто реализуется наиболее логичным и ожидаемым способом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Слыхал я, что стандартом не гарантировано, что... Никому это больше не говорите - это абсолютно секретная информация! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться