На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Запутался в union'ах. , Borland C++ Builder v.6.0.
    Задача: интовое число представить в двух структурах - High_Bits и LowBits. Чтобы обращение было вида Struct.high_bits.bit1.

    Удалось сделать, чтобы число разбивалось в low_bits - но где-то идет логическая ошибка, и High_Bits становится равно Low_Bits.

    Как решить данную проблему, не деля интовое число на 2^8, чтобы разделить высокую и низкую частиэтого числа?

    Чтобы Struct.Value разбивалось именно на бинарные части, а не какое-либо иное их представление.
    Сообщение отредактировано: Сергей85 -
      Ну так прямо же:
      ExpandedWrap disabled
        union Test {
          int value;
          struct {
            char High_Bits, LowBits;
          };
        };

      Эт если int 2 байта.

      Добавлено
      Ну только наоборот: сначала идёт младшая часть, а опосля - старшая. :blush:
      Сообщение отредактировано: JoeUser -
        Цитата Славян @

        Сложно вспомнить, но там речь идет об unsigned long int или unsigned short int.
          Ну если short, то как я и написал. Только желательно и unsigned char влепить. :blush:
            Цитата Славян @
            Ну если short, то как я и написал. Только желательно и unsigned char влепить. :blush:

            Желательно использовать типы из <cstdint>.
            Это избавит от головняка.
              Не работает. Тут лучше бы пример, прям чтобы запустить можно было.

              char High_Bits, LowBits; - эта штука тупо не компилится. У меня Qt.
                У меня в Qt всё прекрасно собирается. :-?
                //Qt Creator 3.4.2 (opensource)
                //Основан на Qt 5.5.0 (MSVC 2013, 32 бита)

                Добавлено
                ExpandedWrap disabled
                  #include <QCoreApplication>
                  #include <QImage>
                  #include <QDir>
                  #include <QDebug>
                   
                  union Test {
                    int value;
                    struct {
                      char High_Bits, LowBits;
                    };
                  };
                   
                  int main(int argc, char *argv[])
                  {
                   Test a;
                   a.value = 55;
                   return a.value;
                  }
                  Не надо так делать.
                  В структуре выравнивание может быть и будут сюрпризы.
                  Битовая арифметика чем не угодила?
                    Цитата cppasm @

                    Я ей и решил. Просто структур и юнионов получилось много - чтобы дойти до бита, длинная последовательность переменных через точку получается. Некрасиво.
                      Чего-чего?
                      ExpandedWrap disabled
                        (value >> 12) & 1

                      Не вижу тут ни одной точки.
                      Со структурами могут быть сюрпризы - ещё раз говорю.
                      Сообщение отредактировано: cppasm -
                        А. Не так понял. Попробую это.
                          Если лениво думать - понаписывай инлайн функций или макросов типа get_bit_n(int value, int n) и потом просто вызывай.
                          Зачем этот огород с юнионами городить?
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0317 ]   [ 16 queries used ]   [ Generated: 29.03.24, 15:03 GMT ]