Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять сегментация :( 
V
    Опции темы
NewDima
Дата 29.12.2008, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Всем привет
[qt opensource 4.4.3]
следующий участок кода
Код

dockWidgetDebug = new QDockWidget("Application progress window", this);
    dockWidgetDebug->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    debugMemo = new QTextEdit(dockWidgetDebug);

выдает в gdb следующие окна во время инициализации debugMemo
user posted image
затем выскакивает сразу ошибка сегментирования
помогите разобраться, из-за чего это
вызов идет так
main.cpp
Код

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowState(Qt::WindowMaximized);
    w.show();
    return a.exec();
}

mainwindow.cpp
Код

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
   ...
    CreateForms();
   ...
}
...
void MainWindow::CreateForms()
{
    dockWidgetDebug = new QDockWidget("Application progress window", this);
    dockWidgetDebug->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    debugMemo = new QTextEdit(dockWidgetDebug);
    QString text = "<html><body bgcolor=\"#c0c0c0\"></body></html>";
    debugMemo->setHtml(text);
}


Добавлено @ 08:34
исходник

Это сообщение отредактировал(а) NewDima - 29.12.2008, 08:54

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  mainwindow.cpp 31,15 Kb
PM ICQ   Вверх
ecspertiza
Дата 29.12.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



а можешь ещё mainwindow.h выложить.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
NewDima
Дата 29.12.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



что интересно, в методе CreateForms() исключил инициализацию debugMemo. Далее создается другое окно, на нем создаются две кнопки (без ошибок) и еще один QTextEdit создается. Вот на нем та же ошибка

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  mainwindow.h 4,98 Kb
PM ICQ   Вверх
ecspertiza
Дата 29.12.2008, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



может конечно оно и не так, но в файлике который ты скинул, объявление debugMemo и  dockWidgetDebug закоментированы, тоесть ты создаёшь объект которого нет, вот и возникает ошибка сигментации.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
NewDima
Дата 29.12.2008, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



сорри, я кинул тот, который уже закомментировал, что бы проверить без них)
если закомментировать, и пытаться создать, компилятор не даст)). А так они без комментов должны быть)

Добавлено через 9 минут и 7 секунд
Может в конструкторе нельзя создавать виджеты QTextEdit? хотя QTreeView создается без ошибок
PM ICQ   Вверх
ecspertiza
Дата 29.12.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Цитата(NewDima @ 29.12.2008,  09:12)
Может в конструкторе нельзя создавать виджеты QTextEdit?

Насколько я знаю можно, слушай а дебагер вроде у тебя не на debugMemo ругается а на QString text, попробуй закоментить или переименовать например str.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
NewDima
Дата 29.12.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(ecspertiza @ 29.12.2008,  16:54)
дебагер вроде у тебя не на debugMemo ругается

точно на него. Дебагер показывает строку, которую будет выполнять дальше, но еще не выполнил
PM ICQ   Вверх
SABROG
Дата 29.12.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Я бы хотел немного к стилистике кода придраться (не сочтите за наезд), т.к. идей насчет ошибки у меня нет smile

Улыбнуло двойное включение хедера
Код

#include <QtGui/QMainWindow>
#include "ui_mainwindow.h"
#include <QMainWindow>


И остальной паровоз GUIшных хедеров. Можно обойтись всего лишь:

Код

#include <QtGui>


Хотя я и не исключаю, что возможно при ручном включении нужных хедеров компиляция будет быстрее.

"typedef struct" - наследие Си ? Чем плох обычный "struct tree_struct" ? Много избыточной информации smile
Код

typedef struct
{
    QStandardItem *itemRoot;
        QStandardItem *itemAnalysis;//analysis
            QStandardItem *itemVarAnal;//Analysis of variance.
            QStandardItem *itemCorrAnal;//A correlation analysis.
            QStandardItem *itemComAnal;//Component analysis



Можно переписать так:

Код

struct tree_struct
{
    QStandardItem *itemRoot,
    *itemAnalysis,
    *itemVarAnal,
    ...
    *otherMath;
    ...
};


Хотя и рекомендуется для членов класса использовать нотацию типа getMethod/setMethod, но тролли обычно get опускают, а set оставляют. К тому же надо придерживаться общего стиля, а то "get", "Get".
Насчет передачи параметров типа QString. Используй передачу по ссылке, если это возможно, метод помечай как const, если он "read only" и не меняет состояния класса. Если не нужна интернационализация (unicode), то используй более легковесный класс QLatin1String, который в конструкторе не переводит строку в Unicode, отчего быстрее. В методе getSettingValue врятли можно будет его использовать из-за операции конкатенации строк, да и для передачи ссылок на строки придется модифицировать метод, чтобы value не менялась.: 

Код

QVariant MainWindow::settingValue(const QString &div, const QString &value) const
{
    return GlobAppSettings->value(div + "/" + value, "error in settings");
}


Тоже самое. Добавить передачу параметра строки по ссылке, сделать const. 
Вынести реализацию в .cpp файл. И может быть сделать перегрузку метода, вместо того, чтобы
объявлять 3 с разными именами ?
Код

    void ShowStr(QString str)
    {
        QMessageBox m;m.setText(str);m.exec();
    }

    void ShowPStr(char* str)
    {
        ShowStr(QString::fromAscii(str));
    }

    void ShowInt(int i)
    {
        ShowStr(QString::number(i));
    }


И может быть вместо 3х вызовов сделать один ?
Код

QMessageBox::information(this, "Caption", "Text");


Тут параметр this не обязателен
Код

connect(Act_CreateProject, SIGNAL(triggered()), this, SLOT(CreateProjectRequested()));

это эквивалентно:
Код

connect(Act_CreateProject, SIGNAL(triggered()), SLOT(CreateProjectRequested()));


В некоторых местах используется макрос TRUE, в некоторых true. Не уверен в идентичности типов или копи-паст с чужих исходников ? Используй true.

Код

GlobAppSettings->setValue("created", TRUE);
...
debugMemo->setReadOnly(true);


Не используй NULL, используй 0. Этот тип относится только к WinApi и тролли его используют только для вызовов API функций винды.

Если дело доходит до такого, вспоминай QLatin1String:
Код

        if (loc=="determinant")
        {
           tree->itemDeterm->setChild(i,0, newItem);
           tree->itemDeterm->setChild(i,1, newItem1);
        } else
        if (loc=="vectspac")
        {
           tree->itemVectSpace->setChild(i,0, newItem);
           tree->itemVectSpace->setChild(i,1, newItem1);
        } else
        if (loc=="slu")
        {
           tree->itemSlu->setChild(i,0, newItem);
           tree->itemSlu->setChild(i,1, newItem1);
        } else
        if (loc=="matrices")
        {
           tree->itemMatr->setChild(i,0, newItem);
           tree->itemMatr->setChild(i,1, newItem1);
        }


DWORD. Таже история (winapi). Если нужен тип с фиксированным размером 4 байта используй quint32. Тролли дают зуб ;)

Это сообщение отредактировал(а) SABROG - 29.12.2008, 10:19


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
NewDima
Дата 29.12.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



блин, большое спасибо по комменту, постараюсь учесть все. Просто я дельфист. На сях начал писать только курсач, думаю для одного месяца пойдет=)

Добавлено через 12 минут и 57 секунд
но вопрос темы в силе
PM ICQ   Вверх
ecspertiza
Дата 29.12.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Может это Qt трабол,  попробуй например тоже самое под Linux собрать, точно так же пробовал создоват QTextEdit всё нормально, и с кодом всё нармуль, 
из вариантов у меня остался только бубен, работает 50 на 50 но может тебе поможет.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
NewDima
Дата 29.12.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



под линой таже проблема. Там с памятью по-жостче.
Бубен не помог, да и времени трясти его нет
PM ICQ   Вверх
pan2004
Дата 29.12.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Кстати, функция SetStandartSettings необязательна - зачем она вообще нужна?
То же самое можно делать при получении значения из QSettings, один из параметров - значение по умолчанию.
И вообще зачем создавать этот виджет(dockWidgetDebug, debugMemo)и другие динамически, если есть ui файл?


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
NewDima
Дата 29.12.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



вообще ui файл убрать надо=)
сейчас этим займусь
Функция SetStandartSettings создает дефолтные настройки, в случае, если ini-файл отсутствует. Я пока ее поставил, чтобы она постоянно запускалась, но для релиза поставлю на условие
спасибо за замечание
PM ICQ   Вверх
pan2004
Дата 29.12.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Попытка воспроизвести ошибку не увенчалась успехом, код:
Код

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);
    widget1 = new QDockWidget("Application progress window", this);
    widget1->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    widget2 = new QTextEdit(widget1);
    QString text = "<html><body bgcolor=\"#c0c0c0\"></body></html>";
    widget2->setHtml(text);
    widget2->setReadOnly(true);
    widget1->setWidget(widget2);
    addDockWidget(Qt::BottomDockWidgetArea, widget1);
}

Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowState(Qt::WindowMaximized);
    w.show();
    return a.exec();
}

работает без проблем. Возможно, проблема кроется в ui файле(?) который каким-то образом интерферирует с написанным тобой кодом. Попробуй убрать вызов
  ui->setupUi(this);
из твоего конструктора.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
SABROG
Дата 29.12.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



А программа то сама работает ? Или это только gdb ругается ?
Сборка debug static ? С релизом тоже самое ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.