Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.119.17] |
|
Сообщ.
#1
,
|
|
|
Есть структура struct, состоящая из кучи булевых переменных. Задача: в цикле пройтись по всем элементам структуры. По возможности, сравнивать тип дочерней переменной с типом Bool.
|
Сообщ.
#2
,
|
|
|
По структурам не проходятся в цикле. Может тебе нужен массив булевых переменных?
|
Сообщ.
#3
,
|
|
|
Цитата Олег М @ Понятно.Можно сделать массив вида key->value? Как его сделать? |
Сообщ.
#4
,
|
|
|
Не знаю что там в билдере, может проще взять vector<bool> ? или key строковое или еще что?
|
Сообщ.
#5
,
|
|
|
Цитата ter_nk_ @ key строковое. |
Сообщ.
#6
,
|
|
|
Ну можно так, если не знаешь сколько у тебя этих значений будет
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) { .... } } |
Сообщ.
#7
,
|
|
|
Цитата Сергей85 @ Если всё же нужно сравнивать не типы, а значения полей такого-то типа, то как-то так можно попробовать:Есть структура struct, состоящая из кучи булевых переменных. Задача: в цикле пройтись по всем элементам структуры. По возможности, сравнивать тип дочерней переменной с типом Bool. struct { ... // поля типа Bool } a; Bool cm; for( int i=0; i<sizeof(a)/sizeof(Bool) ; i++) if( ((Bool *)&a)[i]==cm ) ... |
Сообщ.
#8
,
|
|
|
Цитата Сергей85 @ Понятно.Можно сделать массив вида key->value? Как его сделать? Ты бы объяснил, что тебе конкретно нужно сделать |
Сообщ.
#9
,
|
|
|
Цитата Сергей85 @ Есть структура struct, состоящая из кучи булевых переменных Попробуй так: #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; } |
Сообщ.
#10
,
|
|
|
Цитата Славян @ Да, что-то я про память забыл совсем. for (int i=0; i<9; i++) ((bool*) g_strErrors_Board)[i] = false; //Очистка флагов ошибок плат. Одна проблема. sizeof для структуры работает неправильно, поэтому приходится писать 9 для 9-ти переменных bool в структуре. Так работает, а sizeof(структура) возвращает почему-то 4. |
Сообщ.
#11
,
|
|
|
sizeof работает правильно. Именно такой размер структура и имеет.
|
Сообщ.
#12
,
|
|
|
Цитата Qraizer @ sizeof(bool) = 1. Переменных таких 9. Почему правильно? |
Сообщ.
#13
,
|
|
|
Обычно sizeof возвращает некое "выравнивание структуры". Т.е. если в ней 5 bool'ов, то может вернуть и 8 (если кратно 4 (или 8) выставлено).
|
Сообщ.
#14
,
|
|
|
Цитата Сергей85 @ Потому что компилятор посчитал нужным сделать так. Предположим, у тебя будет массив Struct Bools[5]. Предположим ты решил написать Bools[3] = Bools[2]. Если размер структуры будет невыровненным, может произойти жуткое падение производительности. Стандарт ему разрешает вносить в структуры неиспользуемое пространство между полями и в конце структуры, чтобы обеспечить должное выравнивание полей и элементов массивов. sizeof(bool) = 1. Переменных таких 9. Почему правильно? |
Сообщ.
#15
,
|
|
|
Цитата Славян @ Если всё же нужно сравнивать не типы, а значения полей такого-то типа, то как-то так можно попробовать: Недавно вставал подобный вопрос, но, я решил отказаться от подобной реализации из-за padding-bytes. Цитата sizeof для структуры работает неправильно Это именно тот самый подводный камень padding-bytes сравнивания двух структур побайтово) |
Сообщ.
#16
,
|
|
|
У автора в структуре 9 переменных по 1 байту, sizeof возвращает 4, а вы тут уже про padding-байты начали. Для начала объясните, как 9 байт влезли в 4. Там же поля объявлены как обычные bool, а не как bitfield.
|
Сообщ.
#17
,
|
|
|
Pacific, вангую, что ТС опять начал sizeof указателя проверять.
|
Сообщ.
#18
,
|
|
|
Цитата а sizeof(структура) возвращает почему-то 4 это как вы так меряете? struct Example { ... }; Example test; Измерением размера структуры test будет: sizeof(Example); ну, либо: sizeof(struct Example); Если у вас иначе, читайте сообщение shm. |
Сообщ.
#19
,
|
|
|
Судя по полученному размеру опять вместо структуры был измерен указатель на неё.
|
Сообщ.
#20
,
|
|
|
Да, был sizezof от указателя.
|