-1

C++ の複雑な配列に関する私の問題を教えてください。cmplx 番号の配列 Arr[N] があり、Arr[i] の実数部が必要な場合。ヘッダーには、次のように定義された複雑な配列 CompArray があります。

cmplx** CompArray;

そして、次元[nmax][nmax]を持つように割り当てます

次に、これの一部のみを使用して書き込む function1 があります。

myclass::function1(double* realArray)
realArray = new double [nmax];
cmplx* ComplexArray [nmax];
ComplexArray[] = CompArray[10][];
for(int i=0;nmax;i++){
    realArray[i] = ComplexArray[i].real();
}

エラーが発生します:

error: expression must have class type

エラーは real() または imag() 関数で同じです

4

1 に答える 1

2
cmplx* ComplexArray [nmax];

これは複素数の配列ではありません。これは、数値へのポインターの配列です。数値の配列 (の最初の) へのポインターが必要なようです。

cmplx* ComplexArray = CompArray[10];

次にComplexArray[i]、必要に応じて複素数 (「クラス タイプ」を含む式) です。

それを修正すると、これは少し危険に見えます。

realArray = new double [nmax];

ポインターが渡された後、それを破棄して新しい配列を割り当てます。呼び出し元にはその配列が表示されないため、メモリ リークが発生するだけです。ポインターを参照渡しするか、関数から返すことができます。そうすれば、呼び出し元は少なくとも結果を取得できます。

ただし、生のポインターを動的メモリに渡し、適切なタイミングで削除されることを期待するのはお勧めできません。代わりに、メモリの管理を担当するオブジェクトを渡します。この場合、コンテナが理想的です。

std::vector<double> myclass::function1() {
    std::vector<double> realArray;
    cmplx* ComplexArray = CompArray[10];
    for(int i=0;i<nmax;i++){
        realArray.push_back(ComplexArray[i].real();
    }
    return realArray;
}
于 2013-09-17T17:27:02.120 に答える