В программе, которую я пишу, определенный блок кода работает правильно, только если у меня есть cout << endl
заявление в начале этого. Если его там нет, программа не работает с ошибкой, а просто дает достоверно неверный ответ 100% времени. С cout << endl
Скажите, это работает каждый раз. На самом деле я понятия не имею, что вызывает это, так как я пытался очистить буфер cout, используя cout.flush()
но это не имело никакого эффекта. Кроме того, это не работает, чтобы использовать cout
без конца Я также дважды проверил, и все переменные-члены Node
Структура была инициализирована в списке инициализатора для структуры. Если бы кто-нибудь мог помочь мне с этим, я был бы очень благодарен! Вот оскорбительный кусок кода:
` bool Board::CheckDistinct(Node* node, int* rec) {
cout << endl; // if I comment this line out, it doesn't work correctly
if(node->incoming.size() > 1) {
Node* rec_node = node->incoming[rand() % node->incoming.size()];
*rec = rec_node->row * num_cols() + rec_node->col;
return false;
}
else if(node->incoming.size() == 0) return true;
else {
node->visited = true;
if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
}
}
Вот код для Node
структура (если это помогает):
struct Node {
int val, row, col, dist;
bool visited, is_white_hole, is_black_hole;
Node* outgoing[4];
std::vector<Node*> incoming;
Node(int val_, int row_, int col_) :
val(val_), row(row_), col(col_), dist(-1),
visited(false),
is_white_hole(true), is_black_hole(true) { }
};
Я подозреваю, что проблема в том, что вы не возвращаете свой внутренний результат:
if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
должно быть:
if(!node->incoming[0]->visited) return CheckDistinct(node->incoming[0], rec);
^^^^^^
cout
call, вероятно, просто каким-то образом изменяет генерацию кода (например, компилятор может решить на самом деле рекурсировать, а не конвертировать хвостовую рекурсию в цикл, или использовать другие регистры каким-либо образом, или длинный список других вещей).
(Следует отметить, что я видел эту ошибку много раз, и сделал это несколько раз сам … Это совсем не необычно!)
Хорошо, я наконец нашел это. Ошибка была в операторе возврата:
if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
У меня не было оператора else, который мог бы вернуться, если бы это было не так, поэтому я предполагаю, что на этом этапе произошло неопределенное поведение. Я до сих пор понятия не имею, почему cout << endl
исправил эту проблему, но, думаю, так оно и есть.