2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 [C++] Проблема с функцией
Сообщение13.10.2010, 15:32 


13/09/09
72
Здравствуйте, есть вот такая функция:
Код:
int func(int num)
{
    if(num < 0)
        return -1;
    if(num == 0 || num == 1)
        return 0;

    for(int k = 2; k < num -1; ++k)
    {
         cout << "test";
         if(Какое то условие)
               return 0;
    }
    return 1;
}

Как вызывается данная функция:
Код:
if(func(i))


Допустим мы вызываем ее 100 раз(Со значениями от 1 до 100). При этом цикл for в функции func, выполняется только при первом вызове(Строка "test" выводится только в этот момент). Переменные в функции все локальные(Кроме num), в чем моя ошибка?

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение13.10.2010, 15:55 
Заслуженный участник


04/05/09
4582
Почему Вы решили, что цикл for выполняется только при первом вызове?
Добавьте в вывод значения num и k, а также endl или flush, иначе то, что Вы выводите, может ещё долго лежать в буфере вывода.

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение13.10.2010, 18:43 


13/09/09
72
Пробовал:
Код:
int func(int num)
{
    if(num < 0)
        return -1;
    if(num == 0 || num == 1)
        return 0;

    for(int k = 0; k < num -1; ++k)
    {
         cout << "K: " << k << endl;
         //if(Какое то условие)
         //return 0;
    }

    cout << "NUM: " << num << endl;
    return 1;
}

Вывод:
K: 0
NUM: 2
NUM: 3
NUM: 4
NUM: 5
NUM: 6
NUM: 7
NUM: 8
И т.д.

Я чуть изменил цикл, чтобы было видно, что происходит при первом вызове.

И тогда еще попутно вопрос, когда буферы сбрасываются на печать? Кроме, как при вызове flush?
Я только сейчас прочитал, что endl оказывается еще и сбрасывает буфер, я то думал, что это просто замена '\n'...

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение13.10.2010, 19:00 
Заслуженный участник


04/03/09
906
эм.. а трассировать не пробовали?

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение13.10.2010, 19:02 
Заслуженный участник


04/05/09
4582
Не знаю, что и сказать. У меня остались только предположения о глюках компилятора, или вредительстве с макросами.
Попробуйте выключить оптимизацию.
Можно ещё посмотреть, что выдаёт препроцессор - я могу предложить вариант макроса for который будет давать такой результат.

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение14.10.2010, 04:20 


26/01/10
959
Если есть возможность, надо дать посмотреть весь код целиком. Глюки обычно там, где вы и предположить не можете. Еще скажите версию и название компилятора.

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение30.10.2010, 06:40 


13/09/09
72
Цитата:
эм.. а трассировать не пробовали?
Увы, у меня нет опыта работы с дебагером. Я просто считаю, что на этапе обучения полезнее прокручивать работу кода в уме.

Цитата:
Не знаю, что и сказать. У меня остались только предположения о глюках компилятора, или вредительстве с макросами.

Проблема была на GCC 4.4.3. Может быть проблема в том, что я сам собирал его(Этой же версией компилятора). На Microsoft Visual такой проблемы нет. И на MinGW тоже все работает. Обидно столько времени убил на поиск ошибки.
Около полугода назад тоже была похожая проблема на MinGW. В цикле не инкрементировалась переменная. Я тогда попробовал Microsoft Visual и с ним все заработало. Но там может быть моя ошибка была.

Цитата:
Если есть возможность, надо дать посмотреть весь код целиком. Глюки обычно там, где вы и предположить не можете. Еще скажите версию и название компилятора.
Я перед тем, как создать здесь тему отделил проблемный код.

UPD: Да еще небольшой вопрос.

Допустим у нас есть такой код:
Код:
int main()
{
    try {
    int n;
    vector<int> v;
   
    while(cin >> buf)
    {
        v.push_back(buf);
    }
   
    } catch(exception& e){
        cerr << "Error: " << e.what() << '\n';
        return -1;
    }
   
}

Мы вводим два числа: 52 324
А потом вводим, какой то символ: '#'.
Должно ли сработать исключение? В книге, которую я сейчас читаю, написано, что да, но воспроизвести у меня не получается. Более того, если ввести какой либо символ, то дальше инструкции cin вообще не работают.

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение30.10.2010, 07:20 


26/01/10
959
Цитата:
Проблема была на GCC 4.4.3. Может быть проблема в том, что я сам собирал его(Этой же версией компилятора). На Microsoft Visual такой проблемы нет. И на MinGW тоже все работает. Обидно столько времени убил на поиск ошибки.

А ничего удивительного. У меня есть кое-какие программы, так GCC их вообще компилировать не хочет. Сжирает 2 Гб памяти и через 40 минут безуспешных попыток тихо умирает. Intel C++ при этом компилирует пару минут.

Хотя, может все-таки и у вас ошибка в чем-то, чего вы не понимаете. Такое бывает.

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение30.10.2010, 23:08 


13/09/09
72
Цитата:
Хотя, может все-таки и у вас ошибка в чем-то, чего вы не понимаете. Такое бывает.
Угу...Но меня больше раздражают проблемы, которые возникают из за невнимательности. Если логические ошибки, еще можно себе простить, то невнимательность чаще всего нет. Мой последний бич, это вместо сравнения элементов разных векторов, сравнение элементов одного вектора между собой. Хотя раньше такого не было. Регрессия. :?

 Профиль  
                  
 
 Re: [C++] Проблема с функцией
Сообщение31.10.2010, 21:51 


31/10/10
3
Цитата:
UPD: Да еще небольшой вопрос.

Допустим у нас есть такой код:
Код:
int main()
{
    try {
    int n;
    vector<int> v;
   
    while(cin >> buf)
    {
        v.push_back(buf);
    }
   
    } catch(exception& e){
        cerr << "Error: " << e.what() << '\n';
        return -1;
    }
   
}

Мы вводим два числа: 52 324
А потом вводим, какой то символ: '#'.
Должно ли сработать исключение? В книге, которую я сейчас читаю, написано, что да, но воспроизвести у меня не получается. Более того, если ввести какой либо символ, то дальше инструкции cin вообще не работают.


Нет. cin в данном случае не выкидывает исключения, а устанавливает флаг ошибки. Чтобы, после этого что-то вводить, надо скинуть этот флаг cin.clear() и очистить буфер. Да кстати там имеется две переменные n и buf одна не используется - вторая не определена.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group