0

クラス三角形の 3 つのオブジェクトの 2 番目と 3 番目のコーナーの値を設定しようとしています。明示的に行うと、次のようになります。

triangle_mesh[0].set_vector_point2(vector_anchors[1]);
triangle_mesh[1].set_vector_point3(vector_anchors[1]);
triangle_mesh[1].set_vector_point2(vector_anchors[2]);
triangle_mesh[2].set_vector_point3(vector_anchors[2]);
triangle_mesh[2].set_vector_point2(vector_anchors[3]);
triangle_mesh[0].set_vector_point3(vector_anchors[3]);

そしてこれはうまくいきます!これらの三角形を印刷すると、次のようになります(最初のコーナーはすでに設定されています-これは問題ではありません):

triangle0 is ( 0, 0, -1) (1, 0, 0) (-0.5, -0.866025, 0)
triangle1 is ( 0, 0, -1) (-0.5, 0.866025, 0) (1, 0, 0)
triangle2 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, 0.866025, 0)

第一に、しかし、これは醜く、第二に、設定する三角形が 3 つ以上ある場合に一般化する必要があります。これに対する私のコードは次のとおりです。

for (int longitude = 0; longitude < num_longitudes; longitude++){
  SurfaceVector current_anchor = vector_anchors[1 + longitude];
    triangle_mesh[longitude].set_vector_point2(current_anchor);
    triangle_mesh[(longitude + 1) % num_longitudes].set_vector_point3(current_anchor);
}

*nb num_longitudes は 3*

考えられるすべてをチェックしましたが、三角形を印刷すると次のようになります。

triangle0 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, -0.866025, 0)
triangle1 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, -0.866025, 0)
triangle2 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, -0.866025, 0)

何がうまくいかないのか誰にも分かりませんか?!

編集

三角形の vector_point 変数はポインターであり、次のように設定されます。

void set_vector_point1(SurfaceVector vector_point) { vector_point1 = &vector_point; }
4

2 に答える 2

5

あなたの問題があります:

void set_vector_point1(SurfaceVector vector_point) { vector_point1 = &vector_point; }

あなたは一時的なものを指しています(vector_point関数呼び出しが完了すると存在しなくなります)。SurfaceVector正しくコピーできるように変更してください。

于 2012-03-20T13:03:54.383 に答える
1

私は変更します:

void set_vector_point1(SurfaceVector vector_point) { vector_point1 = &vector_point; }

void set_vector_point1(SurfaceVector& vector_point) { vector_point1 = &vector_point; }

またはそのようなもの。

現在のバージョンでは、 vector_point は渡したもののコピーになり、存在しなくなったオブジェクトへのポインターを格納しているため、存在しなくなります。

2 番目の vector_point は、関数の外部にある長寿命のオブジェクトへの参照です。ポインターを使用するときにオブジェクトがまだ存在するため、ポインターを格納しても問題ありません。

秘訣は、オブジェクトへのすべてのポインターよりもオブジェクトが長く存続することを確認することです。

添加:

以下のコメントで @Nim に感謝します。

行が次の for ループにもあります。

SurfaceVector current_anchor = vector_anchors[1 + longitude];

それもおそらく参照になるはずです..現時点ではそれもコピーです。そうすれば、コピーをいじって捨てるのではなく、配列内の実際のオブジェクトを編集することができます。したがって、その行を次のように変更します。

SurfaceVector& current_anchor = vector_anchors[1 + longitude];
于 2012-03-20T13:20:25.290 に答える