Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Автор FAQ
3148 / 368 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
1

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

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

Author24 — интернет-сервис помощи студентам
У меня случилось что-то вроде парадокса. Прогал я в 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2009, 12:30
Ответы с готовыми решениями:

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

Бесконечный цикл с повторением через промежуток времени
как создать бесконечный цикл с повторением через промежуток времени? вот цикл, который надо...

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

Как сделать бесконечный цикл?
Помогите переделать код так, чтобы после угадывания слова код предлагал сыграть в игру снова, а не...

20
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 12:41 2
И где тут бесконечный цикл?
0
Автор FAQ
3148 / 368 / 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);
 }
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 13:21 4
И каким образом при отладке выясняется, что цикл бесконечный? Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
0
Автор FAQ
3148 / 368 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 13:30  [ТС] 5
Цитата Сообщение от Evg Посмотреть сообщение
И каким образом при отладке выясняется, что цикл бесконечный?
Ставлю брейкпоинт после цикла. Запускаю. До брейпоинта выполнение не доходит. CPU нагружается на 100%. Приходится убивать процесс из диспетчера задач.
Пробовал отлаживать построчно. Замучился нажимать клавишу F7....

Цитата Сообщение от Evg Посмотреть сообщение
Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
В моем файле всего 7 букв
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 14:23 6
Значит возможно глючит отладчик. Для того, чтобы убедиться, вовнутрь первого цикла воткни какую-нибудь печать и сравни поведение из-под отладчика и без него
1
Автор FAQ
3148 / 368 / 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
А в дебагере вышел бесконечный цикл.

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

Добавлено через 1 минуту
Ещё попробуй из цикла удалить "ilist.push_back(c);", может с этим что-то не так
0
Автор FAQ
3148 / 368 / 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
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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';
          }
Но у меня нет опыта работы на Си++, вариант на Си мне куда более понятен и логичен
1
Автор FAQ
3148 / 368 / 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) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 17:07 12
Цитата Сообщение от RNT Посмотреть сообщение
1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Но выводит два раза букву g
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
Блин, я совсем забыл, что ты под виндами... Просто под виндами и юниксами разные принципы работы отладчика. Как вариант попробуй статическую линкову (может отладчик коряво в динамическими приложениями под виндой работает. И не причина ли в том, что отлаживаешь Relese сборку?

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

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

P.S. Я в данной проге Qt не использую
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 17:58 14
Цитата Сообщение от RNT Посмотреть сообщение
Это как сделать ?
Хз, я под виндами как-то только в Borland-студии работал. И gdb под виндами вообще никогда не запускал
0
Автор FAQ
3148 / 368 / 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
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 18:47 16
Цитата Сообщение от RNT Посмотреть сообщение
Очень возможно, что дело не в дебагере т.к. при запуске из IDE прога тоже нормально работать не хочет. Отсюда вопрос: чем запуск из IDE отличается от запуска из Виндовсного Проводника ?
Может проблема в том, что файл не открылся? Проверь "f.is_open ()"
1
Автор FAQ
3148 / 368 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 19:48  [ТС] 17
Цитата Сообщение от Evg Посмотреть сообщение
Может проблема в том, что файл не открылся? Проверь "f.is_open ()"
Да ! Файл не открывается при дебаге и при запуске из IDE.

Сделал так:
Заменил:
C++
1
fstream f("test.txt");
На:
C++
1
fstream f("C:\\Documents and Settings\\RNT\\My Documents\\Parser\\Parser\\bin\\Debug\\test.txt");
И все заработало. Отсюда вывод: при дебаге и при запуске из IDE локальный путь к файлу не работает. Почему ?

Блин, зря я пренебрегал проверкой успешности открытия файла.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.10.2009, 19:54 18
Цитата Сообщение от RNT Посмотреть сообщение
Отсюда вывод: при дебаге и при запуске из IDE локальный путь к файлу не работает. Почему ?
Видимо из разных каталогов запускаются. Как выяснить текущий каталог - не помню. Может в винде getcwd тоже есть
1
Автор FAQ
3148 / 368 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 20:32  [ТС] 19
Цитата Сообщение от Evg Посмотреть сообщение
Видимо из разных каталогов запускаются. Как выяснить текущий каталог - не помню. Может в винде getcwd тоже есть
Функцию, которая может узнать текущий каталог, я нашел только для С++ Билдера. Тогда поступил по другому. Вставил такою строчку в исходник:
C++
1
ofstream test("testfile");
Затем при помощи поиска нашел папку в которой создался файл:
C:\Documents and Settings\RNT\My Documents\Parser\Parser

А exe`шник лежит в папке:
C:\Documents and Settings\RNT\My Documents\Parser\Parser\bin\Debug

При дебаге и при запуске из IDE, текущей папкой считается папка, в которой лежит исходник.

Женя, спасибо тебе за помощь !
0
149 / 50 / 3
Регистрация: 21.12.2008
Сообщений: 960
06.11.2009, 13:43 20
а не могла ли быть (еще) проблема в том, что ты открывал файл fstream - без указания опций???
0
06.11.2009, 13:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2009, 13:43
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru