[C++/Qt]Program raz działa, raz nie, debugowanie problemu


(Kamilmlody5) #1

Witam.

Mam problem z pewnym kodem.

QString nazwaplikuzurl(QString Url)

{

    std::string path = Url.toStdString();

    std::string filename;

    size_t pos = path.find_last_of("//");

    if(pos != std::string::npos)

        filename.assign(path.begin() + pos + 1, path.end());

    else

        filename = path;

    return filename.c_str();

}

double zaokraglijrozmiar(double bajty)

{

    if (bajty < 1024)

    {

        //to pozostaw bity

    } else if (bajty < 1024*1024) {

        bajty /= 1024;

        //na kb

    } else {

        bajty /= 1024*1024;

        //na mb

    }

    QString numer = QString::number(bajty, 'f', 2);//zwroc cyfre do 2 po przecinku

    return numer.toDouble();


}

QString zaokraglijjednostke(double bajty)

{

    QString Zaokraglijjednostke;

    if (bajty < 1024) {

        Zaokraglijjednostke = "b";

    } else if (bajty < 1024*1024) {

        bajty /= 1024;

        Zaokraglijjednostke = "KB";

    } else {

        bajty /= 1024*1024;

        Zaokraglijjednostke = "MB";

    }

    return Zaokraglijjednostke;

}

....

//OD TERAZ WKLEJAJĄC KOD Z DOŁU WYSTĘPUJE PROBLEM

    ui->progressBar->setValue(percentage);

    QString link= ui->lineEdit->text();

    QString cel = ui->lineEdit_2->text() + "\\" + nazwaplikuzurl(link);

    downloadTime = (clock() - czasStart - czasCzekanie)/1000;

    double predkoscsrednia = bytesTotal/downloadTime;

    double predkoscpobierania = bytesReceived / downloadTime;

    double pozostaloSekund = ((bytesReceived - bytesTotal) / predkoscpobierania);

    double szacowanyczaspobierania = bytesTotal/predkoscpobierania;


    QString textNazwaPliku = QString( "Nazwa pliku: %1" )

            .arg(nazwaplikuzurl(link));

    QString textZrodlo = QString( "Źródło: %1" )

            .arg(link);

    QString textCel = QString( "Cel: %1" )

            .arg(cel);

    QString textPredkoscPobierania = QString( "Prędkość pobierania: %1 %2\\s (średnio %3 %4\\s)")

            .arg(zaokraglijrozmiar(predkoscpobierania))

            .arg(zaokraglijjednostke(predkoscpobierania))

            .arg(zaokraglijrozmiar(predkoscsrednia))

            .arg(zaokraglijjednostke(predkoscsrednia));

    QString textRozmiarPobieranegoPliku = QString( "Rozmiar pliku: %1 %2 (%3 bajtów)")

            .arg(zaokraglijrozmiar(bytesTotal))

            .arg(zaokraglijjednostke(bytesTotal))

            .arg(bytesTotal);

    QString textPobrano = QString( "Pobrano: %1 %2 (%3 bajtów)")

            .arg(zaokraglijrozmiar(bytesReceived))

            .arg(zaokraglijjednostke(bytesReceived))

            .arg(bytesReceived);

    QString textUplyneloSekund = QString( "Upłynęło: %1 sekund")

            .arg(downloadTime);

    QString textPozostaloSekund = QString( "Pozostało: %1 sekund")

            .arg(QString::number(pozostaloSekund*-1, 'f', 0));

    QString textSzacowanyCzasPobierania = QString( "Szacowany czas pobierania: %1 sekund")

            .arg(QString::number(szacowanyczaspobierania, 'f', 0));



    ui->label_3->setText(textNazwaPliku);

    ui->label_4->setText(textZrodlo);

    ui->label_5->setText(textCel);

    ui->label_6->setText(textUplyneloSekund);

    ui->label_7->setText(textPozostaloSekund);

    ui->label_8->setText(textSzacowanyCzasPobierania);

    ui->label_9->setText(textPredkoscPobierania);

    ui->label_10->setText(textRozmiarPobieranegoPliku);

    ui->label_11->setText(textPobrano);

Program raz działa raz nie. Działa za 14 razem,a za 15 już nie i wyskakuje błąd(program zostanie zamknięty). Próbowałem go debugować. Wyskakują dwa identyczne problemy: Arithmetic exception (sygnał SIGFPE).

00408f7b:	div %ecx


0040866d:	jmp 0x408677

Wartość z 0x408677;

00408677:	mov 0xc(%ebp),%ecx

Niestety nic mi to nie mówi, ponieważ nie znam Assemblera. Może ktoś wskazać gdzie popełniłem błąd ? Jeżeli nie dałem jakiejś istotniej informacji w celu wykrycia błędu, to proszę mówić.


(Razi) #2

Debugowałeś w trybie Debug? Ustaw kompilowanie na Debug, wyczyść i potem debuguj. Wtedy powinien ci pokazać linijkę kodu w której jest problem.

SIGFPE to błąd typu dzielenie przez 0 (typu całkowitego), lub inne dziwadło arytmetyczne.

BTW. czemu mając do dyspozycji potężnego QStringa męczysz się std::stringiem?

BTW2. 1kB=1000B, 1KiB = 1024B, 1MB=1000000B, 1MiB=1024*1024B, a 1B=8b.

Ja bym to rozwiązał inaczej z tym wyznaczaniem prefiksu:

QString prefix[]={"B", "KiB", "MiB", "GiB", "TiB", "PiB"};

int p=0;

while(rozmiar>1024){

    rozmiar/=1024;

    p++

}

return prefix[p];

(Kamilmlody5) #3

Dzięki Razi. Niestety QT Creator nie chciał doprowadzić mnie do linijki z błędem, więc strzelałem gdzie występuje błąd i go ręcznie znalazłem. Zapewne to z mojej niewiedzy posługiwania się z debugera w Qt Creator. Ze stringiem męczyłem się, ponieważ nie umiałem obcinać na qstringu. Z wyznacznikie prefixu to fakt, mój błąd :wink: