qDebug() << ""; ändert mein Ergebnis?!

Alles rund um die Programmierung mit Qt
Antworten
Marius
Beiträge: 11
Registriert: 8. August 2017 11:28

qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Marius »

Hallo,

Ich bin gerade dabei, eine Funktion zu schreiben, die in meinem Programm die Arbeitszeit aus Stempelsätzen errechnet zu programmieren.
Wie auch immer, mit tollen Funktionen von qt kann man wunderbar die Sekunden errechnen und tun was man will.
Wie auch immer, das sollte für mein Problem doch eigentlich uninteressant sein:
ABER, was gibt es für ein Grund, dass meine Funktion mit dem Befehl "qDebug() << "";" das richtige ausgibt, und wenn Ich den Befehl auskommentiere die Funktion nicht mehr funktioniert?

Ich finde es stark verwirrend, da qDebug() ja nix verändert, sondern nur irwas im Debug anzeigen lassen kann. Desswegen habe Ich gedacht, dass Ich meinen Code nicht posten muss.
Aber Ich werde mich bemühen, wenn jemand doch meint, es könnte mit meinem Code zusammenhängen...(wobei das muss es ja eigentlich, kanns aber doch nicht sein?!)

Ich währe sehr dankbar, wenn Ihr mir in dieser Verwirrung etwas Klarheit bringen könntet.

Grüße Marius
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Christian81 »

Ohne Quellcode so dass man sieht was Du genau machst, wird das schwierig. Zumal 'nicht mehr funktioniert' eine recht schwammige Aussage ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marius
Beiträge: 11
Registriert: 8. August 2017 11:28

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Marius »

Ok, hier der code der Funktion:
Bzw. hier der Aufruf:

Code: Alles auswählen

     int iazeit = qRound(getazeitfromdate1to2()*100);
    QString qsazeit  = QString::number(iazeit/100.0);
//qsazeit wird dann nur noch in nem html-String eingesetzt, um dann die Daten ausdrucken zu können.

Und hier die Funktion;

Code: Alles auswählen

float MainWindow::getazeitfromdate1to2()
{
    QStringList qslIPK;
    QSqlQuery qry(db);
    float farbeitszeitpluspauseinsec;
    float fpausenzeitinsec;
    float fabsolutarbeitszeitinsec;
    float fabsolutarbeitszeitinhours;

    qslIPK=getallfertigvollstaendigeIPKfd1t2();
    qDebug()<< "fertigvollstaendigvon1nach2= " << qslIPK;
    for(int i=0; i<qslIPK.size(); i++)
    {
        qry.prepare("SELECT arbeitstart, arbeitende, pausestart, pauseende, status FROM Stempelsatz WHERE IPK="+qslIPK.at(i));
        qry.exec();

        qry.next();

            if(qry.value(4).toString()=="Arbeit beendet")
            {
                //qDebug() << "Arbeitsipk= " << qslIPK.at(i);
                farbeitszeitpluspauseinsec = farbeitszeitpluspauseinsec + qry.value(0).toTime().secsTo(qry.value(1).toTime());
            }
            if(qry.value(4).toString()=="Pause beendet")
            {
                //qDebug() << "Pausenipk= " << qslIPK.at(i);
                fpausenzeitinsec = fpausenzeitinsec + qry.value(2).toTime().secsTo(qry.value(3).toTime());
            }


        //qDebug() << "des isch d last= " << qry.lastQuery();
    }
    fabsolutarbeitszeitinsec = farbeitszeitpluspauseinsec - fpausenzeitinsec;
    fabsolutarbeitszeitinhours = fabsolutarbeitszeitinsec/3600;
//+++++++++++++++++++++++++++++++qDebug() drinn lassen!!!!!Warum?keine Ahnung!!!
    qDebug() <<"";//izwischen;//<< arbeitszeitpluspauseinsec;
//++++++++++++++++++++++++++++++/
    return fabsolutarbeitszeitinhours;
}

Problembeschreibung:
-Wenn Ich dieses zuletzt aufgerufene qDebug() drinnen lasse, funktioniert die Funktion wie gewollt und gibt zum Beispiel 0,25 aus.
-Wenn Ich aber dieses qDebug() auskommentiere, dann kommt nur noch die Zahl 0 auf meinem Ausdruck an.
Marius
Beiträge: 11
Registriert: 8. August 2017 11:28

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Marius »

Ich weiß nicht, ist das Programm ansich verständlich?
so grob:
-Erst hole Ich mit einer Funktion oben die IPK aus einer QSQlite-Datenbank.
-diese beinhalten Arbeitssätze und Pausensätze. Diese beinhalten jeweils eine Start- und Endezeit.
-Ich muss also die Zeit berechnen von dem Zeitpunkt zu dem sich eine Person eingestempelt und wieder ausgestempelt hat.
->dazwischen kann die Person beliebig viele Pausensätze haben. Diese muss Ich von der Gesammtzeit abziehen.
-unterschieden werden die Sätze mit der Tabellenspalte(4) mit "Arbeit beendet" oder "Pause beendet".

Ich hoffe Ich konnte den Code somit verdeutlichen.
Marius
Beiträge: 11
Registriert: 8. August 2017 11:28

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Marius »

Oder soll Ich einfach die Funktion löschen und neu schreiben in der Hoffnung, dass Ich dann etwas anderst mache? :roll:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Christian81 »

Wenn es keinen Status 'Pause beendet' gibt, ist fpausenzeitinsec uninitialisiert und es kommt Müll zurück.

/edit: Die Variablen am Funktionsanfang zu definieren ist etwas unübersichtlich und die Variablennamen etwas lang. Float für Sekunden zu benutzen ist auch nicht wirklich sinnig - 6 Stellen Genauigkeit macht 1000000s/60/60 = 277h ... ein integer wäre hier viel sinnvoller
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marius
Beiträge: 11
Registriert: 8. August 2017 11:28

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Marius »

Hallo,
danke für die Antwort.
Jap, das kann Ich bestätigen, hab ähnliches gerade nochmal nachprogrammiert und ohne Initialisierung kam da echt komisches zeug :D
Ich bin mir noch nicht ganz einig, wie Ich sie sinnvoll kurz benennen soll, hab noch nicht so viel Erfahrung...
Ja ok, evtl. bin Ich zu früh auf float umgestigen...aber später muss Ich es doch spätestens wenn Ich die Sekunden durch 60/60 für Stunden teile oder nicht?! Also Ich hab ja dann Kommazahlen.

Das heißt, man kann es Zufall nennen, wie qDebug() in meinen Daten rumwurschtelt, da sie nicht initialisert wurden?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Christian81 »

Ja, es war purer Zufall - je nachdem wie der Stack beim Aufruf der Funktion gerade gefüllt war. Ggf. wurde aufgrund des zusätzlichen Aufrufs irgendwas anders angeordnet und die Variable war korrekt mit 0 initialisiert.
Ich würde die Funktion so schreiben:

Code: Alles auswählen

double getAzeitFromDate1to2()
{
    qint64 farbeitszeitpluspauseinsec = 0;
    qint64 fpausenzeitinsec = 0;

    const QStringList qslIPK = getAllFertigVollstaendigeIPKfd1t2();
    qDebug() << "fertigvollstaendigvon1nach2= " << qslIPK;

    QSqlQuery qry(m_db);
        qry.prepare("SELECT arbeitstart, arbeitende, pausestart, pauseende, status FROM Stempelsatz WHERE IPK=:ipk");
    for(int i=0; i<qslIPK.size(); i++)
    {
        qry.bindValue(":ipk", qslIPK.at(i));
        if (!qry.exec() || !qry.next())
        {
            qWarning("Help... - wrong id given?");
            continue;
        }
        const QString state = qry.value(4).toString();

        // Texte als state? mhhh ...
        if(state == "Arbeit beendet")
        {
            const QTime start = qry.value(0).toTime();
            const QTime end = qry.value(1).toTime();
            //qDebug() << "Arbeitsipk= " << qslIPK.at(i);
            farbeitszeitpluspauseinsec  += start.secsTo(end);
        } else if(state == "Pause beendet")
        {
            const QTime start = qry.value(2).toTime();
            const QTime end = qry.value(3).toTime();
            //qDebug() << "Pausenipk= " << qslIPK.at(i);
            fpausenzeitinsec += start.secsTo(end);
        }
        //qDebug() << "des isch d last= " << qry.lastQuery();
    }
    qint64 fabsolutarbeitszeitinsec = farbeitszeitpluspauseinsec - fpausenzeitinsec;
    double fabsolutarbeitszeitinhours = fabsolutarbeitszeitinsec / 3600.;   // 3600. -> implizite Konvertierung in double

    return fabsolutarbeitszeitinhours;
}
Die Namensgebung habe ich mal aussen vor gelassen. In der DB würde ich für den Status keinen String benutzen sondern eine Id - bei Strings ist es schnell passiert dass z.B. die Groß-/Kleinschreibung anders ist oder ein Typo drin ist. Außerdem würde ich in der DB keine QTime speichern sondern direkt die Sekunden (entweder time_t - also seit 01.01.1970 oder seit 00:00) - das ist wesentlich einfacher zu handhaben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marius
Beiträge: 11
Registriert: 8. August 2017 11:28

Re: qDebug() << ""; ändert mein Ergebnis?!

Beitrag von Marius »

vielen Dank Christian81,

Ich würde sagen, mein Problem ist geklärt bzw. der direkte Fehler war, dass Ich keine Initialisierung gemacht hab.
Jedoch konnte Ich zusätzlich von deinem Beispiel das ein oder andere dazulernen damit mein Programm einem besseren Programmierstil näher kommt.

Kann man ein Thema auch als "gelöst" oderso markieren? Ich find nix.

Grüße Marius
Antworten