crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> непонятная бага
Litkevich Yuriy
  опции профиля:
сообщение 23.2.2011, 8:53
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Имеется такой код (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
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Если функцию из dll не вызывать, то все нормально?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 23.2.2011, 11:40
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(Litkevich Yuriy @ 23.2.2011, 9:53) *
П.П.С.
креатор по прежнему не помощник, не показывает QString как строку, только все его внутренности.

Странно. Это разве нормально? У меня он обычно все показывает, даже массивы разворачивает.

А если через QMessageBox выводить строки, то они тоже пустые?

А можешь привести код getFirstComponentItem? Может она что-то со стеком делает или еще с чем-то таким...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.2.2011, 13:04
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Хм... даже не знаю... Функция 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
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 23.2.2011, 15:24) *
то что 2-й qDebug выведет?
сейчас уже не хочется экспериментировать, код сильно переписал, от данной функции пока избавился.

Цитата(Rocky @ 23.2.2011, 15:24) *
Функция getFirstComponentItem генерирует какие-нить исключения?
нет, мало того она статус "Ок" возвращает.

П.С,
Хотя "Ок" - нуль

в связи со всем этим делом, может кто-то знает как МинГВ осуществляет компиляцию?
Т.е. строковые литералы где-то в одном месте лежат? что-то типа таблицы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 13:13