Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 25
1

QDoubleSpinBox - segfault при вызове value(), setValue()

08.07.2013, 13:34. Показов 2099. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Странная проблема, не ожидал, что она может здесь вообще возникнуть. Гугл не помог.

Имеем функцию:

C++ (Qt)
1
2
3
4
5
6
7
8
9
QDoubleSpinBox *Window::createDoubleSpinBox(const double &max, const double &value)
{
    QDoubleSpinBox *spinBox = new QDoubleSpinBox;
    spinBox->setDecimals(10);
    spinBox->setMaximum(max);
    spinBox->setValue(value);
    spinBox->setFixedWidth(120);
    return spinBox;
}
Вызываем её (предварительно объявив всё в *.h)

C++ (Qt)
1
2
3
4
    QDoubleSpinBox *hSpinBox = createDoubleSpinBox(30000, 0.707);
    QDoubleSpinBox *w0SpinBox = createDoubleSpinBox(30000, 10.0);
    QDoubleSpinBox *w1SpinBox = createDoubleSpinBox(30000, 3.0);
    QDoubleSpinBox *FsSpinBox = createDoubleSpinBox(30000, 200.0);
Добавляем это всё в QFormLayout, который в свою очередь пойдёт на mainLayout. Не расписываю подробно, т.к. вроде не в этом проблема.

В один прекрасный момент хочу брать из спинбоксов циферки:
C++ (Qt)
1
2
3
4
        double h = hSpinBox->value();
        double w0 = w0SpinBox->value();
        double w1 = w1SpinBox->value();
        double Fs = FsSpinBox->value();
При выполнении чего программа выдаёт Ошибку сегментации.

При исследовании ошибки выяснилось, что hSpinBox->value(); и w1SpinBox->value(); (где слева от запятой по одной цифре) ошибки не выдают. Они всего лишь не передают значения в свои переменные.

А другие два Бокса - w0 и Fs, где слева от запятой больше одной цифры - ломают прогу, segfault.

Также сегфолт выдаёт например при setValue:
C++ (Qt)
1
hSpinBox->setValue(0.707);
Может кто-то знает баг общеизвестный или мне на ошибку покажет?
Кстати то, что не передаются значения, которые не дают ошибку, тоже смущает.

Буду благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2013, 13:34
Ответы с готовыми решениями:

Segfault при прасинге файла
С++ знаю плоховато. Решил написать себе генератор to-do list`a, вроде даже начало было неплохим, но...

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора...

Segfault при присвоении значения массиву
Доброго времени суток. #include <stdio.h> void del_char(char *str0, const char *str1); /*...

Ошибка при чтении файла mp3 на строке с GetTagSTR.SetValue
Public Class Form1 Dim put As String = IO.Directory.GetCurrentDirectory + "\" Dim i As...

3
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
08.07.2013, 14:20 2
Покажите весь код. Скорее всего, дело в том, что родитель виджетов был удален, а вместе с ним и все его виджеты. Родитель в то время, когда вы читаете значения, жив?
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 25
08.07.2013, 17:56  [ТС] 3
Весь код не пригодился.

ошибка была в следующем:
Цитата Сообщение от KChelnokov Посмотреть сообщение
C++ (Qt)
1
2
3
4
QDoubleSpinBox *hSpinBox = createDoubleSpinBox(30000, 0.707);
QDoubleSpinBox *w0SpinBox = createDoubleSpinBox(30000, 10.0);
QDoubleSpinBox *w1SpinBox = createDoubleSpinBox(30000, 3.0);
QDoubleSpinBox *FsSpinBox = createDoubleSpinBox(30000, 200.0);
Надо так:

C++ (Qt)
1
2
3
4
    hSpinBox = createDoubleSpinBox(30000, 0.707);
    w0SpinBox = createDoubleSpinBox(30000, 10.0);
    w1SpinBox = createDoubleSpinBox(30000, 3.0);
    FsSpinBox = createDoubleSpinBox(30000, 200.0);
Но это метод тыка. Если кто понял в чём проблема, объясните плз. Скилы хоть подниму)
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
08.07.2013, 17:59 4
Вы создавали новые локальные переменные и инициализировали их, а те переменные, с такими же именами, по которым вы впоследствии обращались к виджетам (это были либо глобальные переменные, либо члены класса), остались неинициализированными, и в них находился мусор.
2
08.07.2013, 17:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2013, 17:59
Помогаю со студенческими работами здесь

SegFault при вводе стрококвого поля структуры
struct vuz { char name; int yearOfOpening; int numberOfFaculties; int...

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу...

Валидатор и QDoubleSpinBox
Есть QDoubleSpinBox, необходимо реализовать его так, чтобы можно было устанавливать лишь числа из...

Обертывание значений в QDoubleSpinBox
QDoubleSpinBox сбрасывает значения более 256 и присваивает им отрицательные (вых = 256 - вх(при...

Как выделить число, записанное в QDoubleSpinBox?
Здравствуйте. Есть диалог, внутри много QDoubleSpinBox'ов. Хочу, чтобы при открытии диалогового...

Определить символ разделителя для QDoubleSpinBox
Можно ли для QDoubleSpinBox и QDoubleValidator определить собственный символ-разделитель дробной и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru