2016-11-17 7 views
0

ポインタが違う場合にのみ正しい結果を返すポインタ渡しのC関数を作成しました。例えば:C++関数のポインタ引数が異なる必要があるのはなぜですか?

void dotransform(Point *pout, const Point *pin, transform mat) 
{ 
    pout->x = mat[0][0] * pin->x + mat[1][0] * pin->y + mat[2][0] * pin->z + mat[3][0] * 1.0; 
    pout->y = mat[0][1] * pin->x + mat[1][1] * pin->y + mat[2][1] * pin->z + mat[3][1] * 1.0; 
    pout->z = mat[0][2] * pin->x + mat[1][2] * pin->y + mat[2][2] * pin->z + mat[3][2] * 1.0; 
} 

dotransform()は、このように呼ばれるようになっている:

//... 
Transform toWorldMat; 
Point local; 
Point world; 
dotransform(&world, &local, toWorldMat); 

問題は、私のチームの誰かがこのようにそれを呼ばれる:

Point p; 
dotransform(&p, &p, toWorldMat); 

それはちょうど私を取りましたなぜプログラムの最終的な出力が変わったのかを理解するために1週間。

この種の機能を宣言するための最良のスタイルは、このケースを避けるためですか?私はそれを書くのが間違っていますか?

+4

'Point'パラメータ' pin'を1つだけ送信し、そうでなければ役に立たない関数の戻り値を出力結果として使用します。 – WhozCraig

+0

あなたは(おそらく)C++を使っています:このような簡単な例のためにポインタでオブジェクトを渡さないでください。参照渡し。 – Xirema

答えて

3

既に(ではないがconst&によって:あなたは本当に代わりにそれを行う必要があります)直接transformオブジェクトを渡しているよう見て、あなたがそうのようなコードを書くことができない何らかの理由がある:

Point dotransform(Point const& pin, transform const& mat) 
{ 
    Point pout 
    pout.x = mat[0][0] * pin.x + mat[1][0] * pin.y + mat[2][0] * pin.z + mat[3][0] * 1.0; 
    pout.y = mat[0][1] * pin.x + mat[1][1] * pin.y + mat[2][1] * pin.z + mat[3][1] * 1.0; 
    pout.z = mat[0][2] * pin.x + mat[1][2] * pin.y + mat[2][2] * pin.z + mat[3][2] * 1.0; 
    return pout; 
} 

どの

Transform toWorldMat; 
Point local; 
Point world = dotransform(local, toWorldMat); 

またはこの:

Point p; 
p = dotransform(p, toWorldMat); 
、あなたは、このようなコードを書くことができるようになります

これは、このコードを書くための、理想的なC++の正しい方法です。

関連する問題