ошибка рекурсии c ++ - PullRequest
       35

ошибка рекурсии c ++

0 голосов
/ 01 апреля 2010

У меня следующий рекурсивный код, и он не работает должным образом (подробности см. Ниже):

R3Intersection ComputeIntersectionNode(R3Ray *ray, R3Node *node)
{
  R3Intersection closest_inter;
  R3Intersection child_inter;
  R3Intersection shape_inter;

  double least_t = DBL_MAX;

  // check for intersection with shape
  if(node->shape != NULL)
  {
    shape_inter = ComputeIntersectionShape(ray, node->shape);
    if(shape_inter.hit == 1)
      closest_inter = shape_inter;
  }

  // go through all the children and for each child, compute
  // the closest intersection with ray
  for(int i = 0; i < node->children.size(); i++)
  {
    // compute intersection with children[i] and ray
    child_inter = ComputeIntersectionNode(ray, node->children[i]);

    // if there's an intersection with the child node and
    // it is the closest intersection, set closest intersection
    if(child_inter.hit == 1 && fabs(child_inter.t) < fabs(least_t))
      closest_inter = child_inter;
  }

  return closest_inter;
}

Этот ComputeIntersectionNode(...), в дополнение к рекурсивным вызовам, также вызывается для нескольких лучей в программе. Чтобы проверить эту функцию, я запускаю ее для 4 rays и 4 nodes (или, точнее, одного root типа node, который не имеет shape, но имеет 4 children, каждый из которых имеет один shape). Для тестирования каждый ray пересекается ровно на один node / shape.

Когда я запускаю код в GDB для первого ray, он сначала пропускает root через код, который не имеет shape, поэтому он сразу переходит к children. Он правильно вычисляет пересечение первого дочернего элемента и правильно устанавливает переменную closest_inter, которая возвращается к наивысшему уровню рекурсии, и child_inter, а также closest_inter устанавливаются здесь с child_inter.hit = 1;

Затем обрабатывается второй ребенок. ComputeIntersectionShape(...) не возвращает пересечения со вторым потомком (shape_inter.hit == 0;) - это ожидаемое поведение. Однако, когда функция возвращается к самому высокому уровню рекурсии, по некоторым причинам child_inter.hit устанавливается в 1 (но должен быть установлен в 0).

Есть предложения?

Заранее спасибо.

1 Ответ

1 голос
/ 01 апреля 2010

Я думаю, что ваша проблема вызвана тем, что вы возвращаете инициализированный по умолчанию R3Intersection (т.е. вы не возвращаете shape_inter, когда он не пересекается). В зависимости от конструктора по умолчанию вы можете получить то, что видите.

...