2017-06-28 10 views
0

unsigned intdoubleに変換する正しい方法は何ですか?これは、 と正確にはというグラフを作成するためのパラメータとして、データ設定のためにQCPCustomPlotのために必要です。C++符号なしintをダブル変換する

EDIT:Silly me。 QVector<double> x(time), y(ipv4int)を間違って初期化したため、「メモリリーク」のエラーが発生しました。 timeの値をipv4int(データ発生頻度)に変更し、xyが正しく一致するように変更しました。

変数をtimeとすると、実際の変換に関する問題が解決されました。 1.85592e+09の形式ではなく、1855919686などの値を保持するdouble形式に変換するにはどうすればよいですか。

QCustomPlotがdoubleが必要ですが、QVector<double>が1.85592e + 09

更新されたコードのような値に取ることができなかったようだ:

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]; 
} 

電流出力:

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

_「符号なしint型変数をdouble型に変換するとメモリリークが発生しました」_それについてはどうしましたか?それは通常そうではありません。 –

+1

あなたは何が起こっているのか詳細を提供する必要があります。単純な変換だけでは、メモリリークが発生しません。それは全く別の関心事です。 –

答えて

8

休息を確保unsigned intdoubleに変換すると、ではないはメモリリークの原因となります。

double b = a;の書き込みが十分であるか、パラメータとしてdoubleを必要とする関数にaを渡すだけです。変換はIEEE754倍精度浮動小数点型のために、2の53乗までunsigned intため正確ある

注意。

+0

変換がメモリリークを引き起こさないことを明確にしてくれてありがとう、おそらく私はエラーメッセージを誤解していましたか? – Wei

+1

診断によって暗示されるメモリの問題の原因は他の場所です。 – Bathsheba

+0

テンプレート関数を使用していないことを確認してください。これもいくつかのバグを引き起こす可能性があります:) 例えば、 'std :: accumulate'を使って0と1の間に2つの値を加算し、 unsigned intの場合、要素に対して実行される演算は整数加算になります。それはいくつかの厄介なエラーです。 –

2

timeの値は何ですか?あなたが行うように見えます:

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

ベクトルがtimeのサイズで初期化されているので、時間== 166、間違いなくx[166]が、失敗しようとしている場合は!

そして、ちなみに、キャストに関連するものはdoubleにはありません。

+0

'time'は' 62.3167'分の値を保持します。 'double totalmin = totalsec/60'と' double totalsec = endSecond - startSecond'と同じです。'endSecond'と' startSecond'は '1313743347'のような値を保持する' unsigned int'です – Wei

+1

[QVectorコンストラクタ](http://doc.qt.io/qt-5/qvector.html#QVector-1)はintをとりますしたがって、 'time'の値が' 62.3167'ならば、それは62のサイズで初期化されます。62からの任意のインデックスに直接値を代入することはある点で失敗する可能性がありますが、必ずしも正確に '62'であるとは限りません。私はあなたの場合にresize()を使うか、私のようなものを使うべきだと思います。 – Jean

関連する問題