C ++ - значения не были правильно установлены в цикле for - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь установить значения для 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)

Во-первых, хотя это уродливо, а во-вторых, оно должно распространяться на случаи, когда у меня есть более трех треугольников. Мой код для этого:

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);
}

* n.b. num_longitude 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)

Кто-нибудь знает, что может пойти не так?!

EDIT

Переменные vector_point в треугольнике являются указателями и задаются следующим образом:

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

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

В этом ваша проблема:

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

Вы указываете на временное (vector_point перестает существовать после завершения вызова функции). Измените его, чтобы правильно скопировать SurfaceVector.

1 голос
/ 20 марта 2012

Я бы изменил:

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

до

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

Или что-то в этом роде.

В текущей версии vector_point будет копией того, что вы передаете, и больше не будет существовать после того, как вы сохраните указатель на объект, которого больше не существует.

Во втором элементе vector_point - это ссылка на долгоживущий объект, внешний по отношению к функции. Сохранять указатель на это хорошо, так как объект все еще будет там, когда вы используете указатель.

Хитрость заключается в том, чтобы убедиться, что объект живет дольше, чем все указатели на него.

Сложение:

Спасибо @Nim в комментарии ниже:

Также в цикле for, где строка:

SurfaceVector current_anchor = vector_anchors[1 + longitude];

Вероятно, это тоже ссылка ... на данный момент это тоже копия. Таким образом, вы будете редактировать реальные объекты в массиве, а не играть с копиями и выбрасывать их. Поэтому я бы изменил эту строку на:

SurfaceVector& current_anchor = vector_anchors[1 + longitude];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...