На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Последовательный перебор всех элементов структуры. , Borland C++ Builder v.6.0.
    Есть структура struct, состоящая из кучи булевых переменных. Задача: в цикле пройтись по всем элементам структуры. По возможности, сравнивать тип дочерней переменной с типом Bool.
      По структурам не проходятся в цикле. Может тебе нужен массив булевых переменных?
        Цитата Олег М @

        Понятно.Можно сделать массив вида key->value? Как его сделать?
          Не знаю что там в билдере, может проще взять vector<bool> ? или key строковое или еще что?
            Цитата ter_nk_ @

            key строковое.
              Ну можно так, если не знаешь сколько у тебя этих значений будет

              ExpandedWrap disabled
                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)
                { ....
                }
                }
                Цитата Сергей85 @
                Есть структура struct, состоящая из кучи булевых переменных. Задача: в цикле пройтись по всем элементам структуры. По возможности, сравнивать тип дочерней переменной с типом Bool.
                Если всё же нужно сравнивать не типы, а значения полей такого-то типа, то как-то так можно попробовать:
                ExpandedWrap disabled
                  struct
                  {
                   ... // поля типа Bool
                  } a;
                  Bool cm;
                  for( int i=0; i<sizeof(a)/sizeof(Bool) ; i++)
                    if( ((Bool *)&a)[i]==cm ) ...
                  Цитата Сергей85 @
                  Понятно.Можно сделать массив вида key->value? Как его сделать?

                  Ты бы объяснил, что тебе конкретно нужно сделать
                    Цитата Сергей85 @
                    Есть структура struct, состоящая из кучи булевых переменных

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

                    ExpandedWrap disabled
                      #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;
                      }
                      Цитата Славян @

                      Да, что-то я про память забыл совсем.

                      for (int i=0; i<9; i++) ((bool*) g_strErrors_Board)[i] = false; //Очистка флагов ошибок плат.

                      Одна проблема. sizeof для структуры работает неправильно, поэтому приходится писать 9 для 9-ти переменных bool в структуре. Так работает, а sizeof(структура) возвращает почему-то 4.
                        sizeof работает правильно. Именно такой размер структура и имеет.
                          Цитата Qraizer @

                          sizeof(bool) = 1. Переменных таких 9. Почему правильно?
                            Обычно sizeof возвращает некое "выравнивание структуры". Т.е. если в ней 5 bool'ов, то может вернуть и 8 (если кратно 4 (или 8) выставлено).;)
                              Цитата Сергей85 @
                              sizeof(bool) = 1. Переменных таких 9. Почему правильно?
                              Потому что компилятор посчитал нужным сделать так. Предположим, у тебя будет массив Struct Bools[5]. Предположим ты решил написать Bools[3] = Bools[2]. Если размер структуры будет невыровненным, может произойти жуткое падение производительности. Стандарт ему разрешает вносить в структуры неиспользуемое пространство между полями и в конце структуры, чтобы обеспечить должное выравнивание полей и элементов массивов.
                                Цитата Славян @
                                Если всё же нужно сравнивать не типы, а значения полей такого-то типа, то как-то так можно попробовать:

                                Недавно вставал подобный вопрос, но, я решил отказаться от подобной реализации из-за padding-bytes.


                                Цитата
                                sizeof для структуры работает неправильно

                                Это именно тот самый подводный камень padding-bytes сравнивания двух структур побайтово)
                                Сообщение отредактировано: VisualProg -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0360 ]   [ 17 queries used ]   [ Generated: 20.04.24, 13:07 GMT ]