Добавление endl исправляет код

В программе, которую я пишу, определенный блок кода работает правильно, только если у меня есть 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) { }
};

1

Решение

Я подозреваю, что проблема в том, что вы не возвращаете свой внутренний результат:

    if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);

должно быть:

    if(!node->incoming[0]->visited) return CheckDistinct(node->incoming[0], rec);
^^^^^^

cout call, вероятно, просто каким-то образом изменяет генерацию кода (например, компилятор может решить на самом деле рекурсировать, а не конвертировать хвостовую рекурсию в цикл, или использовать другие регистры каким-либо образом, или длинный список других вещей).

(Следует отметить, что я видел эту ошибку много раз, и сделал это несколько раз сам … Это совсем не необычно!)

3

Другие решения

Хорошо, я наконец нашел это. Ошибка была в операторе возврата:

if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);

У меня не было оператора else, который мог бы вернуться, если бы это было не так, поэтому я предполагаю, что на этом этапе произошло неопределенное поведение. Я до сих пор понятия не имею, почему cout << endl исправил эту проблему, но, думаю, так оно и есть.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector