c ++ рекурсивный вызов, не помещающий элемент в вектор - PullRequest
0 голосов
/ 24 февраля 2012

Несколько дней назад я задал ОЧЕНЬ похожий вопрос на тот, который я собираюсь задать о рекурсии. Вот ссылка на старый вопрос: C ++ vector теряет данные в рекурсивной функции

Сейчас я чувствую себя довольно плотно, потому что мне показалось, что я понял проблему с попыткой передать вектор в рекурсивном вызове, но сейчас у меня проблемы с аналогичной функцией. Вот фрагмент кода для функции:

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, но если треугольник не является треугольником «самого низкого уровня», функция просматривает подтреугольники треугольников, чтобы найти, какой субтреугольник также был пересечен Лучом (один из них будет пересечен дизайном) , Именно здесь происходит рекурсивный вызов, и только после достижения треугольника самого низкого уровня луч будет перемещен к вектору, который называется лучами и является данными-членами TriangleDynamic. Но я снова теряю данные. Есть ли способ сделать это? Я не могу поверить, как быстро и легко ответили на мой предыдущий вопрос, я думал, что попробую еще раз! Спасибо!

1 Ответ

2 голосов
/ 24 февраля 2012
getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);

Ваш вектор живет в TriangleDynamic [как вы сказали], но ваш рекурсивный вызов работает каждый раз на другом экземпляре TriangleDynamic, поэтому vector первого рекурсивного вызова не являетсятакой же, как вектор второго рекурсивного вызова, который не совпадает с вектором 3-го рекурсивного вызова .... [ну, я не могу быть в этом уверен, так как мне нужно больше кода для него, но я предполагаю, что так].

Вы должны будете убедиться, что после рекурсивного вызова вы скопируете vector, который находится в треугольнике, сгенерированном getSubTriangle() в this.

РЕДАКТИРОВАТЬ: просмотрна «трассировке стека» рекурсивного вызова:
Стек вызовов может выглядеть примерно так:

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

При вызове рекурсивного вызова вы получаете [обратите внимание, что triangle_1, triangle_2 отличаютсяобъекты]

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

И так далее: ...

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

Теперь вы модифицируете vector, который находится внутри объекта triangle_n [самый глубокий рекурсивный вызов],но не vector в других треугольниках.
Когда вы возвращаетесь из рекурсии, вы открываете голову, которая является triangle_n - без копирования vector.
В результате - новая информация не была добавлена ​​к вектору в triangle_(n-1), что не передаст ее в triangle_(n-2) ... что не передаст ее в triangle_1 - где вы ожидаете увидеть финалрезультаты.

...