2016-06-15 2 views
0

2つのベクトルの内積を行い、その結果を表示する必要があります。私が学んだことから、C++でできることは、結果のベクトル(ポインタ)のアドレスを返すことです。別の関数で返された配列ポインタを使用する

// Dot product. 
double * dot(double u[3], double v[3]) { 
    double result[3]; 
    result[0] = u[0] * v[0]; 
    result[1] = u[1] * v[1]; 
    result[2] = u[2] * v[2]; 
    return result; 

私は、結果を印刷する必要があるので、私はポインタを受け取り、別の機能があります:

void pvec(double * ptr) { 
    cout << "[" << *(ptr + 0) <<", " << *(ptr + 1) << ", " << *(ptr + 2) << "]\n"; 
} 

これは動作しませんが、私は現在、このコードでいることをやっています。結果の値はすべてゴミです。

どうすればこの作品を作成できますか? Pythonから来て、私は本当に腕や足がないような機能を介して配列を渡すことができないと思っています。ポインタゲームを正しくプレイすることはできません。

void dot(double u[3], double v[3], double result[3]) 

とそれにコードの残りの部分を調整します

+2

関数 'dot'はローカルオブジェクトへのポインタを返します。逆参照されたときの動作は未定義です。 –

+2

さらに、**はポインタゲームをプレイしません**。 C++でやってください。 –

+1

結果を静的 'static double result [3];にするか、動的(より良い)' double * result = new double [3];を割り当てることができ、 'delete [] ptr'が不要ならば解放することができます。ライブデモについてはhttps://ideone.com/FU8L0Iをご覧ください。 – kwarnke

答えて

1

最も簡単な方法は、私の意見では、以下のようにdotプロトタイプを変更することです。

+2

いいえ、最も簡単な方法は 'std :: vector'のような適切なコンテナ型を使うことです。 –

+0

@NickyC私は違います。コンテナは多くのオーバーヘッドと複雑さを増します。特に新規参入者にとって。 – GMichael

+1

標準ライブラリコンテナはゼロオーバヘッドの原則を尊重します。コンテナを通常のオブジェクト、とくに扱うのは簡単です。 Pythonの背景を持つ。学習は、配列からポインタへの減衰、関数の引数での配列からポインタへの調整、オブジェクト/配列の寿命とダングリングポインタ、配列サイズのトラッキングなどの複雑さを伴うが、これに限定されない複雑さを伴う場合、ずっと難しい。 –

関連する問題