Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.34.191] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте, Уважаемые ЗНАТОКИ!
Ребята, кто-то сталкивался с такой ошибкой в обьединении?! и как победили данную ошибку?! 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 }; }; или объясните почему нельзя инициализировать переменные ... Может это связано с общей памятью для переменных?! как тогда лучше работать или есть решение другое?! Спасибо! Добавлено и такое решение, тоже, не прокатывает - область памяти смещается... 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]]; |
Сообщ.
#2
,
|
|
|
Цитата zhuravlev80 @ Может это связано с общей памятью для переменных?! Нет, это связано с невозможностью задания динамического размера массива. Цитата zhuravlev80 @ как тогда лучше работать или есть решение другое?! Объясняю: 1. Ищешь максимум из своих CountArrList 2. Выделяешь память указателю размером с максимум из п.1. 3. Создаешь все свои указатели и присваиваешь в них значение указателя из п.2 4. PROFIT. И union не нужен. Добавлено Как-то так: 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, но мне лень объянять про время жизни объектов, с которым ты сразу столкнешься... |
Сообщ.
#3
,
|
|
|
Цитата спасибо!shm Подсказали... и объяснили... строка for(auto &p : tgg_ms) |
Сообщ.
#4
,
|
|
|
Цитата zhuravlev80 @ возвращает ошибку инициализации в моем билдере, странно! Значит Билдер старый. for(size_t i = 0; i < sizeof(tgg_ms)/sizeof(*tgg_ms); i++) tgg_ms[i] = tgg_ms_main; |
Сообщ.
#5
,
|
|
|
Цитата shm @ билдер 10.1... да так и сделал, как в примере ... вношу одни и те же данные в свое объединение и предложенный Вами. свой код представил 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) значения третье! Что это может быть?! |
Сообщ.
#6
,
|
|
|
Цитата zhuravlev80 @ свой код представил Ну я тогда не уловил твою идею. 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]; } как-то так... |
Сообщ.
#7
,
|
|
|
Цитата shm @ Спасибо! Попробовал Ваши примеры на практике и получается следующее: приведенный фрагмент кода работает, как часы - Китайские... выводи результат правильный! //объявляем тип класса, в котором все данные разделяют одну и туже область памяти... 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... фрагмент код использующий Ваш пример выводит не верный результат... я наверное не то делаю и где-то допускаю грубейшую ошибку, но не могу понять где... /*================================================ ==== используя динамически выделенную область ==== ==================================================*/ 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 Помогите разобраться! Спасибо! |
Сообщ.
#8
,
|
|
|
Цитата zhuravlev80 @ //заполняем tgg_ms значением for (size_t i = 0; i < 9; i++) tgg_ms[i] = AnsiString(OldF->OutStr[i]).c_str(); Так нельзя делать, причем я вижу, что для массива выше ты делаешь правильно (хотя и криво) а тут не так. Менять указатель нельзя. Я строчками выше вычисляю указатели на память, а ты берешь их все и перетираешь. замени присвоение на strcpy(tgg_ms[i], AnsiString(OldF->OutStr[i]).c_str()); |
Сообщ.
#9
,
|
|
|
Цитата 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,.... Иначе ты передаёшь не указатель на массив, а указатель на указатель .... И т.к. ты делаешь явное преобразование типов, то компилятор не ругается. |
Сообщ.
#10
,
|
|
|
Цитата shm @ Цитата zhuravlev80 @ //заполняем tgg_ms значением for (size_t i = 0; i < 9; i++) tgg_ms[i] = AnsiString(OldF->OutStr[i]).c_str(); Так нельзя делать, причем я вижу, что для массива выше ты делаешь правильно (хотя и криво) а тут не так. Менять указатель нельзя. Я строчками выше вычисляю указатели на память, а ты берешь их все и перетираешь. замени присвоение на 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,.... Иначе ты передаёшь не указатель на массив, а указатель на указатель .... И т.к. ты делаешь явное преобразование типов, то компилятор не ругается. Спасибо!!! Вы правы, компилятор ошибку не выдавал!!! Допустил механическую ошибку ... Еще раз спасибо всем!!! Тему можно закрывать! |