[Qt] SIGSEGV

0

Witam wszyskich serdecznie. Problem polega na tym, że ten oto kawałek kodu powoduje jakiś błąd, z którym nie wiem jak sobie poradzić. SIGSEGV, chciałbym zaznaczyć, że ten błąd nie zawsze się pojawia na dodatek też nie zawsze jest błąd w tym samym miejscu. Natomiast jeśli zaremuje kod, w którym są zapisywane ustawienia do pliku poprzez zmienna "ustawienia" (brak jej deklaracji wówczas również) to wtedy błąd się nie pojawia w ogóle. Czyli doszedłem do tego, że błąd generuje zapis ustawień do pliku, natomiast nie wiem dlaczego, może jakieś pomysły. Załączam kod generujący błąd.

Jest to slot, który jest wywoływany po wciśnięciu przycisku na formie.

void programowanie::on_komora_rozpocznij_suszenie_clicked()
{

    ui->komora_zakoncz_suszenie->setEnabled(true);
    ui->komora_rozpocznij_suszenie->setEnabled(false);

    ui->sonda1_k1->setChecked(true); //wlaczenie wszystkich wentylatorow i sond
    ui->sonda2_k1->setChecked(true);
    ui->sonda3_k1->setChecked(true);
    ui->sonda4_k1->setChecked(true);
    ui->sonda5_k1->setChecked(true);
    ui->wentylator1_k1->setChecked(true);
    ui->wentylator2_k1->setChecked(true);
    ui->wentylator3_k1->setChecked(true);
    ui->wentylator4_k1->setChecked(true);
    zapiszStanyKontrolek(m_ostatnia_suszarnia);


    nastawy_komora *tablica_nastawy = ((MainWindow*)parent())->tablica_nastawy;
    //zapiszUstawienia();
    QSettings *ustawienia = new QSettings(QApplication::applicationDirPath() + tr("\\konfiguracja.ini"), QSettings::IniFormat);

    for(int i = 0; i < 24; i++)
    {
        QString suszarnia = QString("Suszarnia") + QString("%1").arg(i+1);

        tablica_nastawy[i].suszenie_status = ustawienia->value(suszarnia + tr("/stan_pracy_komory"), 0).toInt();
        tablica_nastawy[i].jakie_suszenie = ustawienia->value(suszarnia + tr("/rodzaj_suszenia"), 0).toInt();
        tablica_nastawy[i].jakie_drewno = ustawienia->value(suszarnia + tr("/rodzaj_drewna"), 0).toInt();
        tablica_nastawy[i].wilgotnosc_koncowa = ustawienia->value(suszarnia + tr("/wilgotnosc_koncowa_drewna"), 0).toInt();
        tablica_nastawy[i].jaka_grubosc = ustawienia->value(suszarnia + tr("/grubosc_drewna"), 0).toInt();
        tablica_nastawy[i].nawilzanie_praca = ustawienia->value(suszarnia + tr("/czas_nawilzania"), 0).toInt() > 0 ? 1 : 0;
        tablica_nastawy[i].nawilzanie_przerwa = ustawienia->value(suszarnia + tr("/czas_przerwy"), 0).toInt();
        tablica_nastawy[i].obroty_prawe= ustawienia->value(suszarnia + tr("/obroty_prawe"), 0).toInt();
        tablica_nastawy[i].obroty_lewe = ustawienia->value(suszarnia + tr("/obroty_lewe", 0)).toInt();
        tablica_nastawy[i].przewietrzanie_praca = ustawienia->value(suszarnia + tr("/czas_wietrzenia"), 0).toInt();
        tablica_nastawy[i].przewietrzanie_przerwa = ustawienia->value(suszarnia + tr("/cykl_wietrzenia"), 0).toInt();
        tablica_nastawy[i].kominki_min = ustawienia->value(suszarnia + tr("/kominki_min"), 0).toInt();
        tablica_nastawy[i].kominki_max = ustawienia->value(suszarnia + tr("/kominki_max"), 0).toInt();
        tablica_nastawy[i].roznica_wilgotnosci = ustawienia->value(suszarnia + tr("/roznica_wilgotnosci"), 0).toInt();
        tablica_nastawy[i].zawor_min = ustawienia->value(suszarnia + tr("/zawor_min"), 0).toInt();
        tablica_nastawy[i].zawor_max = ustawienia->value(suszarnia + tr("/zawor_max"), 0).toInt();
        tablica_nastawy[i].roznica_temperatury = ustawienia->value(suszarnia + tr("/roznica_temperatury"), 0).toInt();
        tablica_nastawy[i].wentylatory_status = 0;
        tablica_nastawy[i].wentylatory_status |= ustawienia->value(suszarnia + tr("/wentylator1"), 0).toInt() > 0 ? 0x01 : 0;
        tablica_nastawy[i].wentylatory_status |= ustawienia->value(suszarnia + tr("/wentylator2"), 0).toInt() > 0 ? 0x02 : 0;
        tablica_nastawy[i].wentylatory_status |= ustawienia->value(suszarnia + tr("/wentylator3"), 0).toInt() > 0 ? 0x04 : 0;
        tablica_nastawy[i].wentylatory_status |= ustawienia->value(suszarnia + tr("/wentylator4"), 0).toInt() > 0 ? 0x08 : 0;
        tablica_nastawy[i].sondy_status = 0;
        tablica_nastawy[i].sondy_status |= ustawienia->value(suszarnia + tr("/sonda1"), 0).toInt() > 0 ? 0x01 : 0;
        tablica_nastawy[i].sondy_status |= ustawienia->value(suszarnia + tr("/sonda2"), 0).toInt() > 0 ? 0x02 : 0;
        tablica_nastawy[i].sondy_status |= ustawienia->value(suszarnia + tr("/sonda3"), 0).toInt() > 0 ? 0x04 : 0;
        tablica_nastawy[i].sondy_status |= ustawienia->value(suszarnia + tr("/sonda4"), 0).toInt() > 0 ? 0x08 : 0;
        tablica_nastawy[i].sondy_status |= ustawienia->value(suszarnia + tr("/sonda5"), 0).toInt() > 0 ? 0x10 : 0;
        QString nazwa = ustawienia->value(suszarnia + tr("/opis_suszarni"), tr("")).toString();
        tablica_nastawy[i].zegar1=0;
        tablica_nastawy[i].zegar1_status=0;
        tablica_nastawy[i].zegar2=0;
        tablica_nastawy[i].zegar2_status=0;


        for(int k = 0; k < 255; k++)
            tablica_nastawy[i].opis_suszarni[k] = 0;

        for(int j = 0; j < nazwa.length(); j++)
        {
            tablica_nastawy[i].opis_suszarni[j] = nazwa[j].toAscii();
        }

        //data_suszenia
        nazwa = ustawienia->value(suszarnia + tr("/data_suszenia"), tr("")).toString();

        for(int k = 0; k < 255; k++)
            tablica_nastawy[i].data_suszenia[k] = 0;

        for(int j = 0; j < nazwa.length(); j++)
        {
            tablica_nastawy[i].data_suszenia[j] = nazwa[j].toAscii();
        }
    }


    ((MainWindow*)parent())->tablica_nastawy[m_ostatnia_suszarnia-1].suszenie_status = status_ready;

    QString filename = ((MainWindow*)parent())->getFileName(m_ostatnia_suszarnia, QString::fromAscii(tablica_nastawy[m_ostatnia_suszarnia-1].opis_suszarni), false, true);

    QString suszarnia2 = tr("Suszarnia") + QString("%1").arg(m_ostatnia_suszarnia);

    ustawienia->setValue(suszarnia2 + tr("/nazwa_pliku"), filename);

    QString data = QDateTime::currentDateTime().toString(tr("yyyy-dd-MM hh:mm:ss"));
    ustawienia->setValue(suszarnia2 + tr("/data_suszenia"), data);
    ustawienia->sync();
}

Tutaj funkcja z okna głównego

QString MainWindow::getFileName(int nr_device, QString description, bool bBinary, bool bNew)
{
    QString filename;
    if(bNew)
    {
        QDate date = QDate::currentDate();
        QString sNrDevice;
        sNrDevice.sprintf("%i", nr_device);
        if(bBinary)
        {
            filename = date.toString(tr("ddMMyyyy")) + tr("_") + sNrDevice + tr("_") + description;// + ".wb";
        }
        else
        {
            filename = date.toString(tr("ddMMyyyy")) + tr("_") + sNrDevice + tr("_") + description;// + ".csv";
            //zapis nazwy pliku do struktury komory



        }
    }
    else
    {
        QSettings ustawienia(QApplication::applicationDirPath() + tr("\\konfiguracja.ini"), QSettings::IniFormat, this);
        QString suszarnia = QString("Suszarnia") + QString("%1").arg(nr_device);

        filename = ustawienia.value(suszarnia + tr("/nazwa_pliku")).toString();

    }

    return filename;
}
0

Domyślam się że system to linux?

SIGSEGV oznacza że wywaliłeś się poza przydzieloną ci pamięć.

0

Dodałem na końcu funkcji on_komora_rozpocznij_suszenie_clicked()

delete ustawienia;

Wywala się na tym delete właśnie.

0

Nie, nie, Windows XP.

0

Dziwne. Może ten obiekt został usunięty przed twoim delete i wtedy próbujesz już usuwać coś z nie swojej pamięci.

edit: nie słyszłem o sigsegv na windows, ale przeczytałem że to ma coś z przepełnieniem bufora.

0

Jak nie było delete, też sie wywalał :/

0

W takim razie wywala się na destruktorze chyba...
A to musi być dynamiczne? Nie możesz tego zadeklarować jako zmiennej lokalnej?

0

Tutaj wkleiłem wersję z dynamiczną zmienną, wcześniej miałem na lokalnej zmiennej i też się wywalał :/

0

A wywala się na destruktorze czy na zapisie do pliku w końcu?

0

Prawda, że wywala się na destruktorze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1