2012-02-24 14 views
0

数日前、私は再帰について聞いているものと非常によく似た質問をしました。 C++ vector loses data in recursive functionベクトルにアイテムをプッシュしないC++再帰呼び出し

私は再帰呼び出しでベクトルにプッシュしようとすると問題を理解していると思っていたので、今はかなり密集していますが、今では同様の問題が発生しています関数。

void TriangleDynamic::collectRayRecursive(Ray &ray, double binSize, double radius, Point &org) 
{ 
    if (getLowestLevel()) 
    { 
     //this is where I push the ray. 
     raysPushBack(move(ray)); 
    } 

    else 
    { 
     bool foundIntersectSub = false; 
     unsigned int ctr = 0; 
     while((!foundIntersectSub) && (ctr<=getSubTrianglesSize() - 1)) 
     { 
      if (getSubTriangle(ctr).intersect(ray)) 
      { 
       foundIntersectSub = true; 
       getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org); 

      } 
      ctr = ctr + 1; 
     } 
    } 

} 

関数がTriangleDynamicクラスの一部であり、パラメータとしてレイを取る: ここで関数のコードのビットです。 RayはTriangleDynamicオブジェクトと交差することが知られていますが、三角形が「最下位レベル」の三角形でない場合、関数は三角形のsubTrianglesを調べて、Rayによって交差されたsubTriangleを探します(1つはデザインによって交差されます) 。これは再帰呼び出しが発生する場所で、レイと呼ばれるベクトルにレイがプッシュされ、TriangleDynamicのメンバーデータであることが最も低いレベルの三角形に一度しか到達しません。しかし、もう一度私はデータを失う。これを行う方法はありますか?以前の質問にどれだけ早く簡単に答えられたのか信じられません。ありがとう!

+1

光線ベクトルはどこで生きていますか? –

+0

TriangleDynamic asメンバーデータ内。 – user1216527

+0

これを最初に投稿した後に追加しましたが、それはRayオブジェクトを保持するベクトルです。 – user1216527

答えて

2
getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org); 

[あなたが言ったように]あなたのベクトルがTriangleDynamicに住んでいますが、最初の再帰呼び出しのvectorがのベクトルと同じではありませんので、あなたの再帰呼び出しは、TriangleDynamic毎回の別のインスタンス上で動作します2番目の再帰呼び出しは、3番目の再帰呼び出しと同じではありません.... [まあ、もっとコードが必要なので本当にわかりませんが、私はそう仮定します]。

再帰呼び出し後に、getSubTriangle()によって生成されたトライアングルに存在するvectorthisにコピーする必要があります。

EDIT:再帰invokationの「スタックトレース」のPEEK:
呼び出しがスタックはそのような何かになります:あなたが得る再帰呼び出しを呼び出すことによって

|triangle_1.collectRayRecursive()| 
--------------------------------- 

を[そのtriangle_1に注意してください...

012:、異なるオブジェクト]の

|triangle_2.collectRayRecursive()| 
|triangle_1.collectRayRecursive()| 
--------------------------------- 

そしてそうであるtriangle_

オブジェクトtriangle_n [最も深い再帰呼び出し]内にあるvectorを変更しますが、その他の三角形のvectorは変更しません。
再帰から戻ってくると、vectorをコピーしないで、triangle_nの頭をポップします。
結果として、新しい情報はtriangle_(n-1)のベクトルに追加されませんでした。これはtriangle_(n-2)に渡されません。最終結果を期待するtriangle_1には渡されません。

+0

ありがとう、私は理解していると思う。あなたの答えについていくつか質問があります。ベクトルをコピーすると、より高いレベルの三角形に別のベクトルベクトルが作成されますか?私はレイズを最低レベルで保存したいだけです。もうコードを見る必要がある場合は、私に知らせてください。ご協力いただきありがとうございます! – user1216527

+0

@ user1216527:あなたのベクトルが三角形の上に実際に割り当てられている場合は、[値として、参照ではなく]:getSubTriangle()を一時変数に格納しなければなりません[temp.level]それぞれの再帰呼び出しの後に 'this.raysVector'に' [ここに名前をつける]。これは、ベクトルを最深レベルから最初のレベルまでバブル化させます。 – amit

+0

うーん...私はまだ問題があるようです。私は三角形の最下位レベルに達していることを知っています。私はレイを押したことを知っています。しかし、再帰呼び出しの直後に一時変数getSubTriangle(ctr)を作成すると、光線ベクトルは空になります(コピーするものは何もありません)。あなたの忍耐とアイデアをありがとう? – user1216527

関連する問題