2016-11-16 4 views
1

QVectorダブル配列の一部をQtの複素数配列に代入しようとしています。次のコードを実行QVector to Complex

、私はstd::cout << y.at(i) << std::endl;が正しく印刷するという問題を有している16ビットの整数値ではなくstd::cout << y1[i] << std::endl;印刷ゼロ(0,0)(0,0)(0,0)...

0(y [1]、0)(y [2]、0)...

何か問題があると助言できますか?

QVector<double> x(100), y(100); // Original QVector 

std::complex<double> y1[100]; 
int i=0; 

while(i<101) 
{ 
    // get y values from somewhere else (quint8 data8) 

    y[i] = (256.0*data8[2*i]) + 1.0*data8[2*i+1]; 
    std::cout << y.at(i) << std::endl; 

    y1[i] = (y.at(i),0.0); 
    std::cout << y1[i] << std::endl; 

    i++; 
} 
+0

コンマ演算子。 – LogicStuff

+0

C++はPythonではなく、試行錯誤に基づいたプログラミングには格別な悪影響があります。 –

答えて

1

のは、この表現を見てみましょう:

(y.at(i), 0.0) 

C++では括弧は、演算子の優先順位を指定するために使用されているだけのグループ化技術、です。たとえば、2*2+2を実行すると、6つが得られます。しかし、8つにしたい場合は、かっこが必要です:2*(2+2)。割り当て線は次のようになります。

y1[i] = y.at(i), 0.0; 

なぜコンパイルされ、それはどういう意味ですか? comma operatorが使用されているためコンパイルされます。 C++では、カンマは非常に単純なアクションを持つバイナリ演算子です。左辺の引数を計算し、その結果をスローし、右辺の引数を計算して結果を返します。したがって、あなたのケースでは、y.at(i)を破棄してゼロを返しました。これはy1[i]に割り当てられました。あなたは現代のC++でやりたい最短の方法は、初期化子リストを使用することです:あなたは古代のコンパイラを使用している場合

y1[i] = {y.at(i),0.0}; 

、それはちょうど少しより冗長です:

y1[i] = std::complex<double>(y.at(i), 0.0); 
+0

OK、ばかげた間違い。私はその構文、またはコンマ演算子に慣れていないので、徹底的な説明をありがとう。私はこれが他のQt/C++新入社員が学ぶのに役立つことを願っています。 –

+0

@MichaelT答えがあなたに役立つ場合は、それを受け入れることを検討してください – demonplus