У меня есть следующий код:
struct branchInfo{
Quaternion r;
Vector3 p;
std::vector<Vector3> branchPoints;
};
std::vector<Vector3> LSystem::Turtle(){
std::vector<branchInfo> b;
// The axiom should always start with a '[' at the start and a ']' at the end
for(unsigned int i = 0; i < axiom.length(); i++) {
char c = axiom[i];
if (c == '[') {
branchInfo temp;
temp.r = rotationQuat;
temp.p = position;
temp.branchPoints.push_back(position);
b.push_back(temp);
} else if (c == ']') {
branchInfo temp = b.back();
rotationQuat = temp.r;
position = temp.p;
branches.push_back(temp.branchPoints);
b.pop_back();
} else {
// Evaluate the character and move the turtle
// F = move forward according to pitched, rolled, and yawed axis
// f = move backward according to pitched, rolled, and yawed axis
// p = pitch -45 degrees
// P = pitch +45 degrees
// r = roll -45 degrees
// R = Roll +45 degrees
// y = yaw -45 degrees
// Y = yaw +45 degrees
// [ = start new branch
// ] = end new branch
switch(c) {
case 'f':
b.back().branchPoints.push_back(Forward(-1.5f));
break;
case 'F':
b.back().branchPoints.push_back(Forward(1.5f));
break;
case 'p':
Pitch(-angle);
break;
case 'P':
Pitch(angle);
break;
case 'r':
Roll(-angle);
break;
case 'R':
Roll(angle);
break;
case 'y':
Yaw(-angle);
break;
case 'Y':
Yaw(angle);
break;
}
}
}
}
Смысл этого кода - оценить строку аксиомы, которой будет следовать черепаха.Это L-система, и часть смысла L-системы состоит в том, чтобы иметь ветвление, и это происходит, когда есть символ «[», который означает, что поворот и положение сохраняются и будут использоваться позже.Например, если мой класс L-системы содержит строку "[PPPPrrFp[[X]PX]pXRR]"
, я получу следующую ошибку: *** Error in /home/user/program/dist/Debug/GNU-Linux/world': double free or corruption (fasttop): 0x0000000003f43240 ***
Я знаю, что не легко пошагово пройти эту программу, и яне ожидайте, что кто-нибудь сделает это.Мне просто интересно, легко ли увидеть, что не так с программой.Я понимаю, что ошибка, вероятно, связана с использованием некоторых методов / функций std :: vector, но я не понимаю, почему или как она это вызывает.
Кроме того, она не соответствует.Иногда программа запускается без заминки, а в других случаях происходит сбой с упомянутой ошибкой.
Функции для Yaw, Pitch и Roll не должны иметь значения.
Из того, что у меня естьgoogled, я могу найти примеры этой ошибки только при работе с классами, имеющими конструкторы, деструкторы, а также при удалении массивов и т. д.
Спасибо за любую помощь!Я надеюсь, что это очевидно, что происходит и не занимает слишком много времени.Если это выглядит так, как будто это займет слишком много времени, не беспокойтесь.Еще раз спасибо.
РЕДАКТИРОВАТЬ: Чтобы было проще понять, что происходит в функции, я сделаю пошаговое объяснение функции: начните с индекса 0 строки аксиомы и проверьте, если этозапускает новую ветвь ('['), и если это происходит, нажмите и сохраните трехмерный вектор pos и rot ->, если текущий символ не является '[' или ']', затем переместите pos или поверните ->, если ветвь заканчивается(']') восстановить из последней сохраненной позиции и гнили, и вытолкнуть верхнюю часть стека -> продолжать идти для каждого символа в строке.