2017-06-28 6 views
0

Was ist der richtige Weg, unsigned int in double zu konvertieren? Ich brauche das ist für QCPCustomPlot für die Dateneinstellung, wie es in QVector<double>genau als Parameter zum Erstellen eines Graphen dauert.C++ unsigned int zur Doppelkonvertierung

EDIT: Silly mich. Das 'Speicherverlust'-Fehlerproblem wurde verursacht, weil ich falsch initialisiert habe. Der Wert time wurde auf den gleichen Wert wie ipv4int (Häufigkeit des Datenvorkommens) und x und y korrekt geändert.

Fertig mit der time Variable, jetzt das eigentliche Problem in Bezug auf die Konvertierung. Wie kann ich es in double Format konvertieren, das Wert wie 1855919686 statt im Format 1.85592e+09 enthält?

QCustomPlot erfordert double aber es scheint, dass die QVector<double> nicht in Wert wie 1.85592e nehmen könnte + 09

Aktualisiert Code:

QVector<double> x(i), y(totalIP); //i=236052 
for(int o = 0; o <= i; o++){ 
    double dSec = arrayIPxTime[o][0] - startSecond; //arrayIPTime[o][0] holds time in second 
    double dMin = dSec/60; 
    double ipv4addr = arrayIPxTime[o][1]; //arrayIPTime[o][0] holds ipaddr in integer format 
    x[o] = dMin; 
    //y[o] = ipv4addr; this is the line that causes crash. 
    qDebug()<<"Count "<<o<<" time "<< x[o] <<" ipv4 "<<ipv4addr<<" arrayIPxTime[o][1] "<<arrayIPxTime[o][1]; 
} 

Stromausgang:

Count 236048 time 62.3167 ipv4 1.85592e+09 arrayIPxTime[o][1] 1855919686 
Count 236049 time 62.3167 ipv4 1.85592e+09 arrayIPxTime[o][1] 1855919686 
Count 236050 time 62.3167 ipv4 1.85592e+09 arrayIPxTime[o][1] 1855919686 
Count 236051 time 62.3167 ipv4 1.85592e+09 arrayIPxTime[o][1] 1855919686 
+8

_ "Konvertieren von unsigned int-Variablen in doppelt verursachten Speicherlecks" _ Wie sind Sie darauf aufmerksam geworden? Das ist normalerweise nicht der Fall. –

+1

Sie _need_, um mehr Details über das, was passiert, zu geben. Eine einfache Konvertierung selbst verursacht keinen Speicherverlust. Es ist ein völlig anderes Anliegen. –

Antwort

8

Seien Sie versichert, das Umwandeln eines unsigned int zu einem double tut nicht verursacht ein Speicherleck.

Schreiben double b = a; ist mehr als ausreichend, oder übergeben Sie einfach a in die Funktion, die einen double als Parameter erfordert.

Beachten Sie, dass die Konvertierung genau für eine unsigned int bis zur 53. Potenz von 2 ist, für eine IEEE754-Gleitkommazahl mit doppelter Genauigkeit.

+0

Danke zur Klarstellung, dass die Konvertierung keinen Speicherverlust verursacht, vielleicht habe ich die Fehlermeldung falsch verstanden? – Wei

+1

Die Ursache des Speicherproblems, auf das sich die Diagnose bezieht, liegt an anderer Stelle. – Bathsheba

+0

Stellen Sie sicher, dass Sie auch keine Template-Funktionen verwenden, da dies auch einige Fehler verursachen kann. Zum Beispiel, wenn Sie mit 'std :: accumum' doppelte Werte zwischen 0 und 1 addieren, aber den Anfangswert auf ein setzen unsigned int, wird die für die Elemente ausgeführte Operation eine ganzzahlige Addition sein. Das ist ein böser Fehler. –

2

Was ist der Wert von time? Es sieht aus wie Sie das tun:

QVector<double> x(time); 
// [...] 
x[o] = dMin; 

Wenn es die Zeit == 166, kein Zweifel x[166] ist zum Scheitern verurteilt, da der Vektor mit einer Größe von time initialisiert wird!

Und übrigens nichts mit Gießen zu double.

+0

'time' hat einen Wert von' 62.3167' Minuten. Als "double totalmin = totalsec/60" und "double totalsec = endSecond - startSecond".'endSecond' und' startSecond' sind 'unsigned int', die Werte wie' 1313743347' enthalten. – Wei

+1

[QVector constructor] (http://doc.qt.io/qt-5/qvector.html#QVector-1) benötigt einen int Wenn "time" also den Wert '62.3167' hat, wird es mit einer Größe von 62 initialisiert. Das direkte Zuweisen eines Werts zu einem beliebigen Index von 62 wird wahrscheinlich irgendwann fehlschlagen, aber nicht unbedingt bei genau '62'. Ich denke, du solltest in Betracht ziehen, die Größe zu ändern() oder ein ähnliches "i" in deinem Fall zu verwenden. – Jean