На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> E2313 Constant expression required , Ошибка в обьединении...
    Здравствуйте, Уважаемые ЗНАТОКИ!
    Ребята, кто-то сталкивался с такой ошибкой в обьединении?! и как победили данную ошибку?!
    ExpandedWrap disabled
      const int TGG_MESSAGE_LN = lenSum;
      const int TGG_MES01_LN = CountArrList[0];
      const int TGG_MES02_LN = CountArrList[1];
      const int TGG_MES03_LN = CountArrList[2];
      const int TGG_MES04_LN = CountArrList[3];
      const int TGG_MES05_LN = CountArrList[4];
      const int TGG_MES06_LN = CountArrList[5];
      const int TGG_MES07_LN = CountArrList[6];
      const int TGG_MES08_LN = CountArrList[7];
      const int TGG_MES09_LN = CountArrList[8];
       
          static union
          {
          char tggMessage [TGG_MESSAGE_LN];//E2313 Constant expression required
          struct
              {
              char tggMs_01 [TGG_MES01_LN];//E2313 Constant expression required
              char tggMs_02 [TGG_MES02_LN];//E2313 Constant expression required
              char tggMs_03 [TGG_MES03_LN];//E2313 Constant expression required
                      char tggMs_04 [TGG_MES04_LN];//E2313 Constant expression required
              char tggMs_05 [TGG_MES05_LN];//E2313 Constant expression required
              char tggMs_06 [TGG_MES06_LN];//E2313 Constant expression required
              char tggMs_07 [TGG_MES07_LN];//E2313 Constant expression required
              char tggMs_08 [TGG_MES08_LN];//E2313 Constant expression required
              char tggMs_09 [TGG_MES09_LN];//E2313 Constant expression required      
              };
          };

    или объясните почему нельзя инициализировать переменные ...
    Может это связано с общей памятью для переменных?!

    как тогда лучше работать или есть решение другое?!
    Спасибо!

    Добавлено
    и такое решение, тоже, не прокатывает - область памяти смещается...
    ExpandedWrap disabled
      static union
          {
          char* tggMessage;
          struct
              {
              char* tggMs_01;
              char* tggMs_02;
              char* tggMs_03;
                      char* tggMs_04;
              char* tggMs_05;
              char* tggMs_06;
              char* tggMs_07;
              char* tggMs_08;
              char* tggMs_09;    
              };
          };
       
              tggMessage = new char [lenSum];
              tggMs_01 = new char [CountArrList[0]];
              tggMs_02 = new char [CountArrList[1]];
              tggMs_03 = new char [CountArrList[2]];
              tggMs_04 = new char [CountArrList[3]];
              tggMs_05 = new char [CountArrList[4]];
              tggMs_06 = new char [CountArrList[5]];
              tggMs_07 = new char [CountArrList[6]];
              tggMs_08 = new char [CountArrList[7]];
              tggMs_09 = new char [CountArrList[8]];
    Сообщение отредактировано: zhuravlev80 -
      Цитата zhuravlev80 @
      Может это связано с общей памятью для переменных?!

      Нет, это связано с невозможностью задания динамического размера массива.
      Цитата zhuravlev80 @
      как тогда лучше работать или есть решение другое?!

      Объясняю:
      1. Ищешь максимум из своих CountArrList
      2. Выделяешь память указателю размером с максимум из п.1.
      3. Создаешь все свои указатели и присваиваешь в них значение указателя из п.2
      4. PROFIT. И union не нужен.

      Добавлено
      Как-то так:
      ExpandedWrap disabled
        char* tgg_ms_main = new char [*std::max_element(CountArrList, CountArrList + 8)];
        char* tgg_ms[9];
        for(auto& p: tgg_ms)
            p = tgg_ms_main;

      Лучше тут отказаться от new и использовать тот же std::vector, но мне лень объянять про время жизни объектов, с которым ты сразу столкнешься...
      Сообщение отредактировано: shm -
        Цитата
        shm
        спасибо!
        Подсказали... и объяснили... строка
        ExpandedWrap disabled
          for(auto &p : tgg_ms)
        возвращает ошибку инициализации в моем билдере, странно!
          Цитата zhuravlev80 @
          возвращает ошибку инициализации в моем билдере, странно!

          Значит Билдер старый.
          ExpandedWrap disabled
            for(size_t i = 0; i < sizeof(tgg_ms)/sizeof(*tgg_ms); i++)
                tgg_ms[i] = tgg_ms_main;
            Цитата shm @

            билдер 10.1...

            да так и сделал, как в примере :) ...
            вношу одни и те же данные в свое объединение и предложенный Вами.
            свой код представил
            ExpandedWrap disabled
              static union
                  {
                  char tggMessage [SizeAll];
                  struct
                      {
                      char tggMs_01 [Size_1];
                      char tggMs_02 [Size_2];
                      char tggMs_03 [Size_3];
                              char tggMs_04 [Size_4];
                      char tggMs_05 [Size_5];
                      char tggMs_06 [Size_6];
                      char tggMs_07 [Size_7];
                      char tggMs_08 [Size_8];
                      char tggMs_09 [Size_9];    
                      };
                  };

            и на выходе данные, при отладке, они уже разные в tggMessage и &tgg_ms_main
            и при использовании указателя объединении (char* tggMessage) значения третье!
            Что это может быть?!
            Сообщение отредактировано: zhuravlev80 -
              Цитата zhuravlev80 @
              свой код представил

              Ну я тогда не уловил твою идею.
              ExpandedWrap disabled
                char *p = tgg_ms_main;
                for(size_t i = 0; i < sizeof(tgg_ms)/sizeof(*tgg_ms); i++)
                {
                    tgg_ms[i] = p;
                    p += CountArrList[i];
                }

              как-то так...
              Сообщение отредактировано: shm -
                Цитата shm @

                Спасибо! Попробовал Ваши примеры на практике и получается следующее:
                приведенный фрагмент кода работает, как часы - Китайские... выводи результат правильный!
                ExpandedWrap disabled
                  //объявляем тип класса, в котором все данные разделяют одну и туже область памяти...
                      static union
                      {
                      char tggMessage [SizeAll]; //общая переменная сообщения
                   
                      struct {
                                     char tggMs_01 [Size_1]; //компонент общей переменной tggMessage
                                     char tggMs_02 [Size_2]; // |
                                     char tggMs_03 [Size_3]; // |
                                     char tggMs_04 [Size_4];  // |
                                     char tggMs_05 [Size_5]; // |
                                     char tggMs_06 [Size_6];  // |
                                     char tggMs_07 [Size_7]; // |
                                     char tggMs_08 [Size_8]; // |
                                     char tggMs_09 [Size_9];  // |
                             };
                      };
                   
                  /*заполняем переменные tggMs_0* значениями
                  массив CountArrList - содержит значения размера каждой переменной tggMs_0**/
                  for (int i = 0; i < CountArrList[0]; i++) tggMs_01[i] = AnsiString(OldF->OutStr[0]).c_str()[i];
                  for (int i = 0; i < CountArrList[1]; i++) tggMs_02[i] = AnsiString(OldF->OutStr[1]).c_str()[i];
                  for (int i = 0; i < CountArrList[2]; i++) tggMs_03[i] = AnsiString(OldF->OutStr[2]).c_str()[i];
                  for (int i = 0; i < CountArrList[3]; i++) tggMs_04[i] = AnsiString(OldF->OutStr[3]).c_str()[i];
                  for (int i = 0; i < CountArrList[4]; i++) tggMs_05[i] = AnsiString(OldF->OutStr[4]).c_str()[i];
                  for (int i = 0; i < CountArrList[5]; i++) tggMs_06[i] = AnsiString(OldF->OutStr[5]).c_str()[i];
                  for (int i = 0; i < CountArrList[6]; i++) tggMs_07[i] = AnsiString(OldF->OutStr[6]).c_str()[i];
                  for (int i = 0; i < CountArrList[7]; i++) tggMs_08[i] = AnsiString(OldF->OutStr[7]).c_str()[i];
                  for (int i = 0; i < CountArrList[8]; i++) tggMs_09[i] = AnsiString(OldF->OutStr[8]).c_str()[i];
                   
                  // переменные для чтения результата преобразования в mdSHA1
                  unsigned char output1[20], output2[20];
                   
                  /*
                  == проводим операцию над tggMessage и получаем результат, записанный в output2 ==
                  void mdA1( const unsigned char *input, size_t ilen, unsigned char output[20] )
                  */
                  mdA1((const unsigned char*)(&tggMessage), SizeAll, output2);//
                   
                  AnsiString hex_str = "";
                  // представляем значение output1 в необходимой форме
                  for (int i = 0; i < 20; i++) {
                  hex_str += IntToHex(output2[i],2);
                  }
                   
                  Label2->Caption = hex_str;//Out2 result...


                фрагмент код использующий Ваш пример выводит не верный результат... я наверное не то делаю и где-то допускаю грубейшую ошибку, но не могу понять где...
                ExpandedWrap disabled
                  /*================================================
                  ==== используя динамически выделенную область ====
                  ==================================================*/
                  char* tgg_ms_main = new char [SizeAll];
                  char* tgg_ms[9];
                  char *p = tgg_ms_main;
                  for(size_t i = 0; i < sizeof(tgg_ms)/sizeof(*tgg_ms); i++)
                  {
                      tgg_ms[i] = p;
                      p += CountArrList[i];
                  }
                  //заполняем tgg_ms значением
                  for (size_t i = 0; i < 9; i++)
                  tgg_ms[i] = AnsiString(OldF->OutStr[i]).c_str();
                   
                  /*
                  = проводим операцию над tgg_ms_main и получаем результат, записанный в output1 =
                  void mdA1( const unsigned char *input, size_t ilen, unsigned char output[20] )
                  */
                  mdA1((const unsigned char*)(&tgg_ms_main), SizeAll, output1);
                   
                  hex_str = "";
                  // представляем значение output1 в необходимой форме
                  for (int i = 0; i < 20; i++) {
                  hex_str += IntToHex(output1[i],2);
                  }
                   
                  Label1->Caption = hex_str;// Out1 Result

                Помогите разобраться! Спасибо!
                Сообщение отредактировано: zhuravlev80 -
                  Цитата zhuravlev80 @
                  //заполняем tgg_ms значением
                  for (size_t i = 0; i < 9; i++)
                  tgg_ms[i] = AnsiString(OldF->OutStr[i]).c_str();

                  Так нельзя делать, причем я вижу, что для массива выше ты делаешь правильно (хотя и криво) а тут не так. Менять указатель нельзя. Я строчками выше вычисляю указатели на память, а ты берешь их все и перетираешь.
                  замени присвоение на
                  ExpandedWrap disabled
                    strcpy(tgg_ms[i], AnsiString(OldF->OutStr[i]).c_str());
                  Сообщение отредактировано: shm -
                    Цитата zhuravlev80 @
                    /*
                    = проводим операцию над tgg_ms_main и получаем результат, записанный в output1 =
                    void mdSHA1( const unsigned char *input, size_t ilen, unsigned char output[20] )
                    */
                    mdSHA1((const unsigned char*)(&tgg_ms_main), 124, output1);

                    Судя по декларации здесь надо делать mdSHA1((const unsigned char*)tgg_ms_main,....
                    Иначе ты передаёшь не указатель на массив, а указатель на указатель .... И т.к. ты делаешь явное преобразование типов, то компилятор не ругается.
                      Цитата shm @
                      Цитата zhuravlev80 @
                      //заполняем tgg_ms значением
                      for (size_t i = 0; i < 9; i++)
                      tgg_ms[i] = AnsiString(OldF->OutStr[i]).c_str();

                      Так нельзя делать, причем я вижу, что для массива выше ты делаешь правильно (хотя и криво) а тут не так. Менять указатель нельзя. Я строчками выше вычисляю указатели на память, а ты берешь их все и перетираешь.
                      замени присвоение на
                      ExpandedWrap disabled
                        strcpy(tgg_ms[i], AnsiString(OldF->OutStr[i]).c_str());

                      Спасибо за подсказку! понял, что не правильно делал, что переписывал указатель!
                      п.с. для
                      Цитата
                      for (int i = 0; i < CountArrList[0]; i++) tggMs_01[i] = AnsiString(OldF->OutStr[0]).c_str()[i];
                      пробовал формировать через
                      Цитата
                      strcpy(...)
                      компилятор ошибку выдавал...

                      Добавлено
                      Цитата Олег М @
                      Цитата zhuravlev80 @
                      /*
                      = проводим операцию над tgg_ms_main и получаем результат, записанный в output1 =
                      void mdA1( const unsigned char *input, size_t ilen, unsigned char output[20] )
                      */
                      mdA1((const unsigned char*)(&tgg_ms_main), SizeAll, output1);

                      Судя по декларации здесь надо делать mdA1((const unsigned char*)tgg_ms_main,....
                      Иначе ты передаёшь не указатель на массив, а указатель на указатель .... И т.к. ты делаешь явное преобразование типов, то компилятор не ругается.

                      Спасибо!!! Вы правы, компилятор ошибку не выдавал!!! Допустил механическую ошибку ...

                      Еще раз спасибо всем!!! Тему можно закрывать!
                      Сообщение отредактировано: zhuravlev80 -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0478 ]   [ 17 queries used ]   [ Generated: 28.03.24, 20:58 GMT ]