Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Сергей85 @
Понятно.Можно сделать массив вида key->value? Как его сделать?

Ты бы объяснил, что тебе конкретно нужно сделать

Автор: JoeUser 30.05.17, 19:16
Цитата Сергей85 @
Есть структура struct, состоящая из кучи булевых переменных

Попробуй так:

<{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
Цитата Сергей85 @
sizeof(bool) = 1. Переменных таких 9. Почему правильно?
Потому что компилятор посчитал нужным сделать так. Предположим, у тебя будет массив 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 от указателя.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)