Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ непонятная бага
Автор: Litkevich Yuriy 23.2.2011, 8:53
Имеется такой код (Qt 4.7.1):
QString s;
QString s1;
s = QString("refdes[1] - %1");
qDebug() << "String[1] =" << s;
s1 = comp.refDes();
qDebug() << "S1[1] =" << s1;
s = s.arg(s1);
qDebug() << s;
dbxStatus = getFirstComponentItem(&dbxContext, "R9", &dbxComponentItem );
s = QString("refdes[2] - %1");
qDebug() << "String[2] =" << s;
s1 = comp.refDes();
qDebug() << "S1[2] =" << s1;
s = s.arg(s1);
qDebug() << s;
Вывод в консоль совершенно не понятен:
String[1] = "refdes[1] - %1"
S1[1] = "C3"
"refdes[1] - C3"
---------------------------------- // тут вызов getFirstComponentItem
""
"C3"
QString::arg: Argument missing: , C3
""
почему после вызова функции
getFirstComponentItem в отладку не идут константные строки, и почему после этой функции s1 стала пустой.
П.С.
после вызова
getFirstComponentItem во всей программе перестают печататься в поток ошибок строковые константы, хоть через
qDebug, хоть через
stderr.
П.П.С.
креатор по прежнему не помощник, не показывает QString как строку, только все его внутренности.
П.П.П.С.
getFirstComponentItem - функция из DLL-ки
Автор: SABROG 23.2.2011, 9:17
Если функцию из dll не вызывать, то все нормально?
Автор: Rocky 23.2.2011, 11:40
Цитата(Litkevich Yuriy @ 23.2.2011, 9:53)
П.П.С.
креатор по прежнему не помощник, не показывает QString как строку, только все его внутренности.
Странно. Это разве нормально? У меня он обычно все показывает, даже массивы разворачивает.
А если через QMessageBox выводить строки, то они тоже пустые?
А можешь привести код
getFirstComponentItem? Может она что-то со стеком делает или еще с чем-то таким...
Автор: Litkevich Yuriy 23.2.2011, 13:04
Цитата(SABROG @ 23.2.2011, 11:17)
Если функцию из dll не вызывать, то все нормально?
да
Цитата(Rocky @ 23.2.2011, 13:40)
А можешь привести код getFirstComponentItem?
нет кода, только dll-ка и заголовочник.
Цитата(Rocky @ 23.2.2011, 13:40)
Может она что-то со стеком делает
разве ОСь на это не должна реагировать? Всё-таки строковые литералы - область "только для чтения"
Автор: Rocky 23.2.2011, 13:24
Хм... даже не знаю... Функция getFirstComponentItem генерирует какие-нить исключения? Может ее обернуть в try/catch? Или вообще попробовать из отдельного потока вызывать?
Цитата
разве ОСь на это не должна реагировать? Всё-таки строковые литералы - область "только для чтения"
Х его з. Пару лет назад, когда я подробно в этом всем разбирался смог бы ответить.. Сейчас уже не знаю. Насколько я помню, ОС должна реагировать (имею ввиду SIGTERM и пр) если затираются какие-то системные блоки памяти. Т.е. если выделить память под массив на 10 элементов, а потом обратиться к 11-му (случайно), то далеко не факт что прога выдаст assertion. Последствия теоретически могут быть такими, какие ты пишешь. А т.к. кода этой dll нет, то хрен его знает что там происходит, что слетает... Строки или вообще потоки вывода....
А если например так написать:
int xxx = 123;
qDebug() << xxx;
dbxStatus = getFirstComponentItem(&dbxContext, "R9", &dbxComponentItem );
qDebug() << xxx;
то что 2-й qDebug выведет?
Автор: Litkevich Yuriy 23.2.2011, 15:42
Цитата(Rocky @ 23.2.2011, 15:24)
то что 2-й qDebug выведет?
сейчас уже не хочется экспериментировать, код сильно переписал, от данной функции пока избавился.
Цитата(Rocky @ 23.2.2011, 15:24)
Функция getFirstComponentItem генерирует какие-нить исключения?
нет, мало того она статус "Ок" возвращает.
П.С,
Хотя "Ок" - нуль
в связи со всем этим делом, может кто-то знает как МинГВ осуществляет компиляцию?
Т.е. строковые литералы где-то в одном месте лежат? что-то типа таблицы?
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)