очень странно зависать при инициализации цикла - PullRequest
1 голос
/ 12 августа 2011

У меня очень странная ошибка, которую я не могу понять.Я сузил его до небольшого фрагмента кода (если компилятор не переупорядочивает мои операторы, что я не верю в истинность).

...
std::cout << "here"<< std::endl;
std::vector<int>::iterator n_iter;
std::vector<int>::iterator l_iter;
std::cout << "here?" << std::endl;
for(n_iter = n.begin(), std::cout << "not here" ; std::cout << "or here" && n_iter < n.end(); n_iter++)
{
    std::cout << "do i get to the n loop?";
    ...
}

Когда я запускаю это, я вижу первое «здесь»", второе" здесь? ", но я не получаю вывод" не здесь "или" или здесь ".И я определенно не получаю «я добираюсь до цикла n?».

Странная вещь в том, что моя программа работает (она почти полностью использует ядро ​​процессора ...), ноон не заканчивается, он просто зависает.

Я пытался использовать clang ++ и g ++, и я не использую никаких оптимизаций.У меня установлена ​​библиотека boost (и я использую ее часть boost_program_options) вместе с броненосцем.Но я не думаю, что компилятор должен переупорядочивать вещи ...

Это происходит с вызовами cout или без них внутри объявления цикла for, и он не просто пропускает цикл.

Вектор "n" имеет длину не менее 1 и задается вызовом boost_program_options.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Первое, что вы должны попробовать - вывести std::endl после каждой строки. Это очищает буфер для вывода.

2 голосов
/ 12 августа 2011

Следующая программа (в которой есть некоторые дополнительные символы новой строки, которых у вас нет):

#include <string>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> n;
    n.push_back(3);
    n.push_back(3);
    n.push_back(3);

    std::cout << "here"<< std::endl;
    std::vector<int>::iterator n_iter;
    std::vector<int>::iterator l_iter;
    std::cout << "here?" << std::endl;

    for(n_iter = n.begin(), std::cout << "not here\n" ; std::cout << "or here\n" && n_iter < n.end(); n_iter++)
    {
        std::cout << "do i get to the n loop?\n";
    }
}

Имеет следующий вывод:

[5:02pm][wlynch@orange /tmp] make foo
g++     foo.cc   -o foo
[5:02pm][wlynch@orange /tmp] ./foo
here
here?
not here
or here
do i get to the n loop?
or here
do i get to the n loop?
or here
do i get to the n loop?
or here

Похоже, вы ожидаете,поэтому я не уверен, где у вас проблемы с вашей стороны, но это может быть в пропущенном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...