Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
#1

Как можно пройти через бесконечный цикл ??? - C++

31.10.2009, 12:30. Просмотров 2626. Ответов 20
Метки нет (Все метки)

У меня случилось что-то вроде парадокса. Прогал я в Eclipse (у него компилятор MinGW, отладчик GDB), напрогал выложенную ниже программу. Компилирую ее, кладу рядом с бинарником файл test.txt с каким-нибудь текстом. Запускаю. В консоли выводится содержимое текстового файла, который лежит рядом. Далее начинаю отлаживать программу. При отладке выясняется, что самый первый цикл в программе - бесконечный. А операции вывода на консоль следуют после бесконечного цикла. Следовательно вопрос: как можно пройти через бесконечный цикл ? Пробовал также Code::Blocks (у него такой-же компилятор и дебагер), с ним те-же результаты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <fstream>
#include <list>
 
using namespace std;
 
int main()
{
    fstream f("test.txt");
    list<char> ilist; //объявляю список
    list<char>::iterator it; //и итератор
    while (! f.eof())
    {
        char c; //буфер
        f >> c ;
        ilist.push_back(c);
    }
    it = ilist.begin();
    it++;
    ilist.insert(it, '&');
    int size = ilist.size(); // число элементов
    for(int j=0; j<size; j++)
    {
        cout << ilist.front(); // читать данные из начала
        ilist.pop_front(); // извлечение данных из начала
    }
    f.close();
    char c; //чтобы окно
    cin >> c; //не закрылось
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2009, 12:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как можно пройти через бесконечный цикл ??? (C++):

Можно ли сделать бесконечный цикл с while, используя тип bool? - C++
... bool f; f=false; while(f=false) { ... ... ... if(....)//какое-то условие f=true;//цикл прерывается

Бесконечный цикл с повторением через промежуток времени - C++
как создать бесконечный цикл с повторением через промежуток времени? вот цикл, который надо повторять: #include&lt;iostream&gt; ...

Как можно вывести задачу через цикл for - C++
Как вывести задачу через цикл for: S= 0.18x + (0.20x)^2 + (0.22x)^3 +...+ (0.36x)^10; (x=1, s=0.236)

Бесконечный цикл (как избежать?) - C++
Программа должна принимать только одно из трёх значений переменной 'destiny'. Если вводят любое другое значение, программа должна повторять...

как создать бесконечный цикл - C++
помогите)нужно чтоб можно было вводить несколько раз за сеанс)экзе файл закрывается

Как создать бесконечный цикл - C++
Не могу создать бесконечный цикл, для проверки символов вводимых пользователем. Нужно чтобы при вводе букв выдавалось ошибка, что можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 12:41 #2
И где тут бесконечный цикл?
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 12:58  [ТС] #3
Цитата Сообщение от Evg Посмотреть сообщение
И где тут бесконечный цикл?
Цитата Сообщение от RNT Посмотреть сообщение
При отладке выясняется, что самый первый цикл в программе - бесконечный
C++
1
2
3
4
5
6
while (! f.eof())
 {
 char c; //буфер
 f >> c ;
 ilist.push_back(c);
 }
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 13:21 #4
И каким образом при отладке выясняется, что цикл бесконечный? Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 13:30  [ТС] #5
Цитата Сообщение от Evg Посмотреть сообщение
И каким образом при отладке выясняется, что цикл бесконечный?
Ставлю брейкпоинт после цикла. Запускаю. До брейпоинта выполнение не доходит. CPU нагружается на 100%. Приходится убивать процесс из диспетчера задач.
Пробовал отлаживать построчно. Замучился нажимать клавишу F7....

Цитата Сообщение от Evg Посмотреть сообщение
Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
В моем файле всего 7 букв
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 14:23 #6
Значит возможно глючит отладчик. Для того, чтобы убедиться, вовнутрь первого цикла воткни какую-нибудь печать и сравни поведение из-под отладчика и без него
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 15:07  [ТС] #7
Цитата Сообщение от Evg Посмотреть сообщение
Значит возможно глючит отладчик. Для того, чтобы убедиться, вовнутрь первого цикла воткни какую-нибудь печать и сравни поведение из-под отладчика и без него
Похоже так оно и есть. Сделал такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <list>
 
using namespace std;
 
int main()
{
    fstream f("test.txt");
    list<char> ilist; //объявляю список
    list<char>::iterator it; //и итератор
    int i=0;
    while (! f.eof())
    {
        char c; //буфер
        f >> c ;
        ilist.push_back(c);
        cout << i++<<'\n';
    }
    it = ilist.begin();
    it++;
    ilist.insert(it, '&');
    int size = ilist.size(); // число элементов
    for(int j=0; j<size; j++)
    {
        cout << ilist.front(); // читать данные из начала
        ilist.pop_front(); // извлечение данных из начала
    }
    f.close();
    char c; //чтобы окно
    cin >> c; //не закрылось
    return 0;
}
В файле test.txt написал anything, запустил exe`шник. В консоли вышло:

Код
0
1
2
3
4
5
6
7
8
a&nythingg
А в дебагере вышел бесконечный цикл.

Что мне делать ? Отлаживать дебагер ?
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 15:19 #8
Цитата Сообщение от RNT Посмотреть сообщение
Что мне делать ? Отлаживать дебагер ?
Учиться отлаживаться без дебаггера. Или установить более свежий, потому как есть подозрение, что там маненько устаревший. Для порядку ещё поставь печать того, что прочлось из файла. Особой пользы это не принесёт, но по крайней мере будет понятно, отладчик своей работой портить непосредственный чтения из файла или feof

Добавлено через 1 минуту
Ещё попробуй из цикла удалить "ilist.push_back(c);", может с этим что-то не так
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 15:42  [ТС] #9
Цитата Сообщение от Evg Посмотреть сообщение
Ещё попробуй из цикла удалить "ilist.push_back(c);", может с этим что-то не так
Не подействовало

Цитата Сообщение от Evg Посмотреть сообщение
Учиться отлаживаться без дебаггера.
Все равно что читать с закрытыми глазами.

Цитата Сообщение от Evg Посмотреть сообщение
Или установить более свежий, потому как есть подозрение, что там маненько устаревший.
GDB у меня свежайший. Вчера скачал.

Цитата Сообщение от Evg Посмотреть сообщение
Для порядку ещё поставь печать того, что прочлось из файла. Особой пользы это не принесёт, но по крайней мере будет понятно, отладчик своей работой портить непосредственный чтения из файла или feof
Сделал я так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <list>
 
 
using namespace std;
 
int main()
{
    fstream f("test.txt");
    list<char> ilist; //объявляю список
    list<char>::iterator it; //и итератор
    while (! f.eof())
    {
        char c; //буфер
        f >> c ;
        ilist.push_back(c);
        cout << c<<'\n';
    }
    it = ilist.begin();
    it++;
    ilist.insert(it, '&');
    int size = ilist.size(); // число элементов
    for(int j=0; j<size; j++)
    {
        cout << ilist.front(); // читать данные из начала
        ilist.pop_front(); // извлечение данных из начала
    }
    f.close();
    char c; //чтобы окно
    cin >> c; //не закрылось
    return 0;
}
Если запустить exe`шник из Проводника, то выводит:

Код
a
n
y
t
h
i
n
g
g
a&nythingg
Если дебажить, то опять бесконечный цикл. И выводит только знаки переноса строк, буквы не выводить вообще.

И еще одна зацепка. Если из IDE Code::Blocks запустить прогу командой Build=>Run, то будет бесконечный цикл. И выводит только знаки переноса строк, буквы не выводить вообще. Так что дело может не в GDB
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 15:57 #10
Цитата Сообщение от RNT Посмотреть сообщение
Все равно что читать с закрытыми глазами.
Я 99% отладки делаю при помощи печатей без всяких отладчиков. 0.99% - запуск отладчика для того, чтобы понять, в какой точке программа фатально навернулась. Оставшиеся 0.01% - это тяжёлые случаи навроде того, когда выход за границу массива испортил данные, а проявляется это очень далеко от точки возникновения ошибки. Но такие ситуации у меня возникают всё реже и реже, т.к. их предупреждают средства статического контроля (ASSERT'ы) в критических или опасных местах кода

Цитата Сообщение от RNT Посмотреть сообщение
И еще одна зацепка. Если из IDE Code::Blocks запустить прогу командой Build=>Run, то будет бесконечный цикл. И выводит только знаки переноса строк, буквы не выводить вообще. Так что дело может не в GDB
ТОгда появни в двух словах, а как ДО этого ты запускал из отладчика? Я почему-то думал, что с отладчиком и без отладчика ты запускал один и тот же бинарник

Добавлено через 9 минут
Кстати, последний символ у тебя печатается два раза. А это означает, что ты неправильно работаешь с файлом

Экспериментальным путём получилось, что вот такой цикл правильно считывает нужное количество символов
C++
1
2
3
4
5
6
7
8
        while (1)
          {
            char c; //буфер
            f >> c ;
            if (f.eof())
              break;
            cout << c << '\n';
          }
Но у меня нет опыта работы на Си++, вариант на Си мне куда более понятен и логичен
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 16:43  [ТС] #11
Цитата Сообщение от Evg Посмотреть сообщение
ТОгда появни в двух словах, а как ДО этого ты запускал из отладчика?
Поясню варианты которые я пробовал.

1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Но выводит два раза букву g
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |

Цитата Сообщение от Evg Посмотреть сообщение
Я 99% отладки делаю при помощи печатей без всяких отладчиков.
Зачем так принципиально ? С отладчиком ведь гораздо удобнее, если он работает нормально

Цитата Сообщение от Evg Посмотреть сообщение
Экспериментальным путём получилось, что вот такой цикл правильно считывает нужное количество символов
Вот результаты:

1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Выводит один раз букву g как надо
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 17:07 #12
Цитата Сообщение от RNT Посмотреть сообщение
1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Но выводит два раза букву g
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
Блин, я совсем забыл, что ты под виндами... Просто под виндами и юниксами разные принципы работы отладчика. Как вариант попробуй статическую линкову (может отладчик коряво в динамическими приложениями под виндой работает. И не причина ли в том, что отлаживаешь Relese сборку?

Цитата Сообщение от RNT Посмотреть сообщение
Зачем так принципиально ? С отладчиком ведь гораздо удобнее, если он работает нормально
На мой взгляд печатями гораздо удобнее. Та за одну секунду получаешь всю трассу работы программы, в то время как в отладчике проковыряешь полдня. Не говоря уж о том, что не зависишь от наличия отладчика. Но речь не об этом
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 17:25  [ТС] #13
Цитата Сообщение от Evg Посмотреть сообщение
И не причина ли в том, что отлаживаешь Relese сборку?
С этим все в порядке. Сборка Debug

Цитата Сообщение от Evg Посмотреть сообщение
Как вариант попробуй статическую линкову (может отладчик коряво в динамическими приложениями под виндой работает
Это как сделать ?

P.S. Я в данной проге Qt не использую
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
31.10.2009, 17:58 #14
Цитата Сообщение от RNT Посмотреть сообщение
Это как сделать ?
Хз, я под виндами как-то только в Borland-студии работал. И gdb под виндами вообще никогда не запускал
RNT
Автор FAQ
3134 / 354 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 18:29  [ТС] #15
Цитата Сообщение от RNT Посмотреть сообщение
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
Очень возможно, что дело не в дебагере т.к. при запуске из IDE прога тоже нормально работать не хочет. Отсюда вопрос: чем запуск из IDE отличается от запуска из Виндовсного Проводника ?

P.S. В Eclipse те-же самые проблемы что и в Code::Blocks
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2009, 18:29
Привет! Вот еще темы с ответами:

как засунуть условно-бесконечный цикл - C++
еще позавчера как-то умудрился, но задача решена была неверно, сейчас уже мозг потек... #include &lt;iostream&gt; #include &lt;cmath&gt; ...

Почему цикл на при 1 уходит в бесконечный цикл? - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() { int x=0, y=0,...

Есть бесконечный цикл в программе и она поэтому занимает процессор, как это исправить? - C++
НАписал себе напоминалку, а она жрёт процессор (~~ 45%); код упростил для понятности #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include...

Бесконечный цикл - C++
Здравствуйте. Программа должна принимать некоторые значения, обрабатывать их и выдавать в виде статистики (нарисовать звездочками). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.10.2009, 18:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru