Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
Витос223
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 16
#1

Ошибка в программе во время выполнения - C++ Qt

09.01.2017, 10:48. Просмотров 239. Ответов 10
Метки нет (Все метки)

Компилятор MinGW не обнаруживает никаких проблем в данном коде.
Первая проблема. Хотя при открытии диалога очень часто возникает исключение SEGMENTATION FAULT.
Вторая проблема. В отладчике показывается, что file никак не инициализируется (написано "Недоступно" в значении переменной file), хотя strfile имеет верное значение в отладчике, и поэтому doc.setContent(&file) является ложным и не выполняется нужный мне код в if.
Третья проблема. Компилятор MSVC выдаёт ошибку "QDomDocument: no such file or directory", хотя MinGW не выдаёт этой ошибки, при этом я включил заголовочный файл QDomDocument.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
QDomDocument doc;
    QString strfile = QFileDialog::getOpenFileName(0, "Открытие справочника", "", "xml файл(*.xml)");
 
    if (!strfile.isEmpty()) {
        QFile file(strfile);
        if (file.open(QIODevice::ReadOnly)) {
            QString str = file.fileName();
            if(doc.setContent(&file)) {
                QDomElement elem = doc.documentElement();
                traverseNode(elem);
            }
            file.close();
        }
    }
 Комментарий модератора 
Ставьте теги правильно!
Правила именования тем и оформления сообщений в разделе Qt


Добавлено через 16 часов 44 минуты
Вторая проблема отпала. Переменная QFile в отладчике не должна иметь значение, а проблема была в том, что в xml файле было название тега через пробел. Но первая и третья проблемы постоянно мучают.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wyn
Модератор
931 / 512 / 193
Регистрация: 14.01.2016
Сообщений: 1,692
Записей в блоге: 9
09.01.2017, 10:56     Ошибка в программе во время выполнения #2
Цитата Сообщение от Витос223 Посмотреть сообщение
Но первая и третья проблемы постоянно мучают.
Segmentation fault обычно означает переход по невалидному указателю. И обычно такое место прекрасно ищется запуском приложения в debug-режиме и вызове segmentation fault. Отладчик вам покажет место, где программа вываливается.

Третья проблема может быть в том, что вы забыли включить в файле проекта модуль xml, который и поставляет QDomDocument.
Код
QT += xml
Или же он у вас вообще не установлен. Проверьте.
Витос223
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 16
09.01.2017, 11:51  [ТС]     Ошибка в программе во время выполнения #3
Цитата Сообщение от Wyn Посмотреть сообщение
Третья проблема может быть в том, что вы забыли включить в файле проекта модуль xml, который и поставляет QDomDocument.
Модуль включён в файл проекта, тем более MinGW этой ошибки не выдаёт.

Добавлено через 16 минут
Также возникла ещё одна проблема. При чтении xml файла русские буквы записываются вопросиками в ромбе.
Wyn
Модератор
931 / 512 / 193
Регистрация: 14.01.2016
Сообщений: 1,692
Записей в блоге: 9
09.01.2017, 12:15     Ошибка в программе во время выполнения #4
Цитата Сообщение от Витос223 Посмотреть сообщение
Также возникла ещё одна проблема. При чтении xml файла русские буквы записываются вопросиками в ромбе.
При чтении буквы записываются. Очень информативно. Как читаете? Куда и как записываете?
Витос223
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 16
09.01.2017, 13:33  [ТС]     Ошибка в программе во время выполнения #5
Я читаю в переменную QString из xml файла с помощью DOM значение тега. Но так как текст в теге записан русскими буквами, то при выводе переменной QString выводятся вопросительные знаки в ромбиках.

Добавлено через 3 минуты
Цитата Сообщение от Wyn Посмотреть сообщение
И обычно такое место прекрасно ищется запуском приложения в debug-режиме и вызове segmentation fault.
А если ошибка в библиотеке qt, то что тогда делать. Qt 5.8 не предлагать (не компилируется под android).
Wyn
Модератор
931 / 512 / 193
Регистрация: 14.01.2016
Сообщений: 1,692
Записей в блоге: 9
09.01.2017, 14:05     Ошибка в программе во время выполнения #6
Цитата Сообщение от Витос223 Посмотреть сообщение
Я читаю в переменную QString из xml файла с помощью DOM значение тега. Но так как текст в теге записан русскими буквами, то при выводе переменной QString выводятся вопросительные знаки в ромбиках.

А если ошибка в библиотеке qt, то что тогда делать. Qt 5.8 не предлагать (не компилируется под android).
Вы мой вопрос видели? Или вы думаете, что я вам смогу помочь, ничего не зная, что вы там конкретно делаете и с чем вы конкретно работаете? Я ведь тоже могу свой ответ не расписывать и просто посоветовать вам самостоятельно декодировать файл в QString, затем подставить этот QString в QDomDocument, а затем результат записать с нужным кодированием в место вывода.

Ошибка в библиотеке Qt маловероятна. В 99 случаях из 100 проблема в том, что программисты не выполняют требований, налагаемых на них библиотекой и не соблюдают условия последовательности использования библиотечных функций.
Qt 5.8 ещё не релизнулся, смысл вам его использовать?
Витос223
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 16
09.01.2017, 14:47  [ТС]     Ошибка в программе во время выполнения #7
Цитата Сообщение от Wyn Посмотреть сообщение
Qt 5.8 ещё не релизнулся, смысл вам его использовать?
Qt 5.8 уже релизнулся, правда в бета версии.

Добавлено через 3 минуты
Вот код, в котором обрабатывается чтение xml файла.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void MainWindow::traverseNode(const QDomNode &node)
{
    QStringList lst;
    QDomNode dn = node.firstChild();
    while (!dn.isNull()) {
        if(dn.isElement()) {
            QDomElement elem = dn.toElement();
            if(!elem.isNull()) {
                if(elem.tagName() == "date") {
                    lst << elem.text();
                    QList <QStandardItem *> row;
                    for (int i = 0; i < model->columnCount(); ++i) {
                        QStandardItem *item = new QStandardItem(lst.at(i));
                        row.append(item);
                    }
                    model->appendRow(row);
                    lst.clear();
                }
                else {
                    lst << elem.text();
                }
            }
        }
        traverseNode(dn);
        dn = dn.nextSibling();
    }
}
Wyn
Модератор
931 / 512 / 193
Регистрация: 14.01.2016
Сообщений: 1,692
Записей в блоге: 9
09.01.2017, 16:12     Ошибка в программе во время выполнения #8
Цитата Сообщение от Витос223 Посмотреть сообщение
Qt 5.8 уже релизнулся, правда в бета версии.
Продукт не может релизнуться в бета версии. Бета - это один из этапов создания продукта:
- develop
- alpha
- beta
- pre-release
- release
Продукт считается законченным и вышедшим с момента официального релиза.
Цитата Сообщение от Витос223 Посмотреть сообщение
Вот код, в котором обрабатывается чтение xml файла.
То есть вы выводите данные в стандартную модель? Тогда проблема с кодировкой лежит в чтении файла. Читайте файл в QByteArray и затем с помощью нужного кодека перегоняйте его в utf-8 для QString.
Проблема с вылетом может быть в lst.at(i). Если вы не уверены, что элемент существует в контейнере QStringList, то нужно использовать не at, а value.
Витос223
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 16
09.01.2017, 16:33  [ТС]     Ошибка в программе во время выполнения #9
Цитата Сообщение от Wyn Посмотреть сообщение
Проблема с вылетом может быть в lst.at(i).
Она у меня в другом месте (при открытии диалога)
C++ (Qt)
1
QString strfile = QFileDialog::getOpenFileName(0, "Открытие справочника", "", "xml файл(*.xml)");
Добавлено через 16 минут
Цитата Сообщение от Wyn Посмотреть сообщение
Читайте файл в QByteArray и затем с помощью нужного кодека перегоняйте его в utf-8 для QString
Так в QDomElement нет функции для получения данных внутри тега в QByteArray.
Wyn
Модератор
931 / 512 / 193
Регистрация: 14.01.2016
Сообщений: 1,692
Записей в блоге: 9
09.01.2017, 21:34     Ошибка в программе во время выполнения #10
Цитата Сообщение от Витос223 Посмотреть сообщение
Так в QDomElement нет функции для получения данных внутри тега в QByteArray.
QDomElement тут ни при чём. Я говорю про QDomDocument. Засовывайте в него в качестве источника не файл, а уже обработанный кодеком QString.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2017, 22:50     Ошибка в программе во время выполнения
Еще ссылки по теме:

C++ Qt Ошибка в программе с туториала expected primary-expression before ')' token
C++ Qt Странный порядок выполнения методов
Отображение прогресса выполнения программы C++ Qt
Замедление выполнения цикла for C++ Qt
Ошибка во время процесса установки Qt: "qmake.exe -query is not parsable" C++ Qt

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Витос223
1 / 1 / 0
Регистрация: 14.11.2015
Сообщений: 16
09.01.2017, 22:50  [ТС]     Ошибка в программе во время выполнения #11
Так что насчёт первой и третьей проблемы.
Yandex
Объявления
09.01.2017, 22:50     Ошибка в программе во время выполнения
Ответ Создать тему
Опции темы

Текущее время: 10:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru