Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > C/C++: Общие вопросы > Последовательный перебор всех элементов структуры. |
Автор: Сергей85 30.05.17, 16:19 |
Есть структура struct, состоящая из кучи булевых переменных. Задача: в цикле пройтись по всем элементам структуры. По возможности, сравнивать тип дочерней переменной с типом Bool. |
Автор: Олег М 30.05.17, 16:28 |
По структурам не проходятся в цикле. Может тебе нужен массив булевых переменных? |
Автор: Сергей85 30.05.17, 16:43 |
Цитата Олег М @ Понятно.Можно сделать массив вида key->value? Как его сделать? |
Автор: ter_nk_ 30.05.17, 16:56 |
Не знаю что там в билдере, может проще взять vector<bool> ? или key строковое или еще что? |
Автор: Сергей85 30.05.17, 16:58 |
Цитата ter_nk_ @ key строковое. |
Автор: ter_nk_ 30.05.17, 17:16 |
Ну можно так, если не знаешь сколько у тебя этих значений будет <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> struct MyVal { std::string s; bool bVal; } std::vector<MyVal> myValVector; MyVal v1, v2; //заполнил myValVector.push_back(v1); //пройти for(int i=0;myValVector.size();i++) { if(myValVector[i].bBal == true) { .... } } |
Автор: Славян 30.05.17, 18:25 |
Цитата Сергей85 @ Если всё же нужно сравнивать не типы, а значения полей такого-то типа, то как-то так можно попробовать:Есть структура struct, состоящая из кучи булевых переменных. Задача: в цикле пройтись по всем элементам структуры. По возможности, сравнивать тип дочерней переменной с типом Bool. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> struct { ... // поля типа Bool } a; Bool cm; for( int i=0; i<sizeof(a)/sizeof(Bool) ; i++) if( ((Bool *)&a)[i]==cm ) ... |
Автор: Олег М 30.05.17, 18:31 |
Ты бы объяснил, что тебе конкретно нужно сделать |
Автор: JoeUser 30.05.17, 19:16 |
Попробуй так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include <iostream> #pragma pack (push, 1) struct Struct { bool f1; bool f2; bool f3; bool f4; bool f5; }; #pragma pack (pop) using ArrayBool = bool[sizeof(Struct)]; int main() { Struct Bool = {true, true, false, false, true}; for(const auto &i : *(reinterpret_cast<ArrayBool*>(&Bool))) std::cout << i << std::endl; return 0; } |
Автор: Сергей85 01.06.17, 15:54 |
Цитата Славян @ Да, что-то я про память забыл совсем. for (int i=0; i<9; i++) ((bool*) g_strErrors_Board)[i] = false; //Очистка флагов ошибок плат. Одна проблема. sizeof для структуры работает неправильно, поэтому приходится писать 9 для 9-ти переменных bool в структуре. Так работает, а sizeof(структура) возвращает почему-то 4. |
Автор: Qraizer 01.06.17, 16:19 |
sizeof работает правильно. Именно такой размер структура и имеет. |
Автор: Сергей85 01.06.17, 16:34 |
Цитата Qraizer @ sizeof(bool) = 1. Переменных таких 9. Почему правильно? |
Автор: Славян 01.06.17, 17:08 |
Обычно sizeof возвращает некое "выравнивание структуры". Т.е. если в ней 5 bool'ов, то может вернуть и 8 (если кратно 4 (или 8) выставлено). |
Автор: Qraizer 01.06.17, 18:17 |
Потому что компилятор посчитал нужным сделать так. Предположим, у тебя будет массив Struct Bools[5]. Предположим ты решил написать Bools[3] = Bools[2]. Если размер структуры будет невыровненным, может произойти жуткое падение производительности. Стандарт ему разрешает вносить в структуры неиспользуемое пространство между полями и в конце структуры, чтобы обеспечить должное выравнивание полей и элементов массивов. |
Автор: VisualProg 05.06.17, 07:30 |
Цитата Славян @ Если всё же нужно сравнивать не типы, а значения полей такого-то типа, то как-то так можно попробовать: Недавно вставал подобный вопрос, но, я решил отказаться от подобной реализации из-за padding-bytes. Цитата sizeof для структуры работает неправильно Это именно тот самый подводный камень padding-bytes сравнивания двух структур побайтово) |
Автор: Pacific 06.06.17, 15:07 |
У автора в структуре 9 переменных по 1 байту, sizeof возвращает 4, а вы тут уже про padding-байты начали. Для начала объясните, как 9 байт влезли в 4. Там же поля объявлены как обычные bool, а не как bitfield. |
Автор: shm 06.06.17, 15:56 |
Pacific, вангую, что ТС опять начал sizeof указателя проверять. |
Автор: VisualProg 07.06.17, 14:51 |
Цитата а sizeof(структура) возвращает почему-то 4 это как вы так меряете? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> struct Example { ... }; Example test; Измерением размера структуры test будет: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> sizeof(Example); ну, либо: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> sizeof(struct Example); Если у вас иначе, читайте сообщение shm. |
Автор: amk 08.06.17, 14:45 |
Судя по полученному размеру опять вместо структуры был измерен указатель на неё. |
Автор: Сергей85 14.06.17, 16:13 |
Да, был sizezof от указателя. |