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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
#1

Бесконечные циклы. - C++

05.04.2011, 20:14. Просмотров 2401. Ответов 14
Метки нет (Все метки)

Довольно часто допускаются ошибки приводящие к бесконечным циклам.
Только что такой бесконечный цикл едва не вынудил прервать работу горячей перезагрузкой - компьютер завис почти намертво.
Можно ли как нибудь оградить себя от подобных зависаний системы?
ОС Ubuntu.
Буду благодарен за отклики и предложения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2011, 20:14     Бесконечные циклы.
Посмотрите здесь:

Бесконечные суммы - C++
И опять я по этой теме обращаюсь.. Как реализовать такую формулу? В ней чередуются +/-, заданная точность - 0,005

Бесконечные суммы - C++
Создать программу для вычисления бесконечных сумм. Вычислить приближенное значение бесконечной суммы с точностью ε кое что...

бесконечные последовательности - C++
как описать цыкл от 0 до бесконечности???

Библиотека gmp.h, бесконечные числа - C++
вопрос такой: как выводить числа, которые длинной больше 10 символов?как работает gmp_get_str?

Бесконечные адреса одной переменной. МоСК кипит... - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int main() { int * pAddressOne; int *...

Циклы - C++
Дано целое число а. Вывести все числа в диапазоне от 0 до а, которые делятся без остатка на 3, и сумму этих чисел. а вводит пользователь, и...

Циклы в С++ - C++
1) Начав тренировки, спортсмен пробежал 10 км. Каждый день он увеличивал дневную норму на 10% нормы предыдущего дня. Какой суммарный путь...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2011, 13:16     Бесконечные циклы. #2
Вставь в тело цикла вот эту функцию, это позволит работать с программой даже в случае зацикливания
C++
1
2
3
4
5
6
7
8
void PumpMessages(HWND hWND)
{
    MSG msg;
    // Handle dialog messages
    while(PeekMessage(&msg, hWND, 0, 0, PM_REMOVE))
        if(!IsDialogMessage(hWND, &msg) && TranslateMessage(&msg))
            DispatchMessage(&msg); 
}
hWND - дескриптор диалогового окна программы или консоли, вобщем дескриптор окна для которого хочешь сохранить контроль
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
06.04.2011, 14:53  [ТС]     Бесконечные циклы. #3
а не объяснишь ка это может помочь??
StagnantIce
123 / 103 / 1
Регистрация: 06.03.2011
Сообщений: 334
06.04.2011, 15:09     Бесконечные циклы. #4
видимо заставляет обрабатывать сообщения даже когда прога висит
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
06.04.2011, 15:14  [ТС]     Бесконечные циклы. #5
Я встречался уже с функцией PeekMessage, но как ее тут применить?
У меня консольное приложение занимающееся математическими вычислениями...
StagnantIce
123 / 103 / 1
Регистрация: 06.03.2011
Сообщений: 334
06.04.2011, 15:31     Бесконечные циклы. #6
подключить библиотеку для работы c WinApi видимо
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
06.04.2011, 15:44  [ТС]     Бесконечные циклы. #7
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
ОС Ubuntu
Какую там дидлиотеку подключить? WinApi??
-=ЮрА=-
Заблокирован
Автор FAQ
07.04.2011, 19:59     Бесконечные циклы. #8
Вот как юзаю в программе


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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
void CStorage::PumpMessages(HWND hWND)
{
    MSG msg;
    // Handle dialog messages
    while(PeekMessage(&msg, hWND, 0, 0, PM_REMOVE))
        if(!IsDialogMessage(hWND, &msg) && TranslateMessage(&msg))
            DispatchMessage(&msg); 
}
 
WIN32_FIND_DATA * CStorage::MkPathList(LPCTSTR szPath)
{
    WIN32_FIND_DATA pFILE_DATA;ULONG uIND = nStgElm; 
    pDATA[nStgElm].dwFileAttributes = GetFileAttributes(szPath);
    pDATA[nStgElm].dwReserved1      = iINDENT;
    HANDLE hFile = CreateFile(
        strcpy(pDATA[nStgElm].cFileName,szPath), 
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL, 
            OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        uStgLen += (pDATA[nStgElm].nFileSizeLow = GetFileSize(hFile,NULL));
        CloseHandle(hFile);
        nStgElm++;
    }
    else
    {
        if(strcmp(pDATA[nStgElm].cFileName,"") == 0)
           strcpy(pDATA[nStgElm].cFileName,"+");
        sprintf(pFILE_DATA.cFileName,"%s\\*.*",pDATA[nStgElm].cFileName);
        hFile = FindFirstFile(pFILE_DATA.cFileName,&pFILE_DATA);
        if(hFile != INVALID_HANDLE_VALUE)
        {
            iINDENT++;
            pDATA[(uIND = nStgElm)].nFileSizeLow = uStgLen;
            pDATA = (WIN32_FIND_DATA *)realloc
                        (
                            (void *)pDATA,
                            sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                        );
            do
            {
                if(strcmp(pFILE_DATA.cFileName,".")  == 0 ||
                   strcmp(pFILE_DATA.cFileName,"..") == 0)
                    continue;
                else
                {
                    pFILE_DATA.dwReserved1 = iINDENT;
                    pDATA[nStgElm] = pFILE_DATA;
                    sprintf(pDATA[nStgElm].cFileName,"%s\\%s",szPath,pFILE_DATA.cFileName);
                    if(FILE_ATTRIBUTE_DIRECTORY & pFILE_DATA.dwFileAttributes)
                    try
                    {
                        MkPathList(pDATA[nStgElm].cFileName);
                    }
                    catch(...)
                    {
                        iINDENT--;
                        //MessageBox(m_hWnd,strerror(GetLastError()),"ERROR",MB_OK);
                    }
                    else
                    {
                        uStgLen += pFILE_DATA.nFileSizeLow;
                        pDATA = (WIN32_FIND_DATA *)realloc
                                    (
                                        (void *)pDATA,
                                        sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                                    );
                    }
                    PumpMessages(m_hWnd);//Избегаю зависания
                }
            }
            while(FindNextFile(hFile,&pFILE_DATA) != 0);
            FindClose(hFile);
            pDATA[uIND].nFileSizeLow = uStgLen - pDATA[uIND].nFileSizeLow;
            iINDENT--;
        }
    }
    return pDATA;
}
Добавлено через 2 минуты
Вот как юзаю в программе


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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
void CStorage::PumpMessages(HWND hWND)
{
    MSG msg;
    // Handle dialog messages
    while(PeekMessage(&msg, hWND, 0, 0, PM_REMOVE))
        if(!IsDialogMessage(hWND, &msg) && TranslateMessage(&msg))
            DispatchMessage(&msg); 
}
 
WIN32_FIND_DATA * CStorage::MkPathList(LPCTSTR szPath)
{
    WIN32_FIND_DATA pFILE_DATA;ULONG uIND = nStgElm; 
    pDATA[nStgElm].dwFileAttributes = GetFileAttributes(szPath);
    pDATA[nStgElm].dwReserved1      = iINDENT;
    HANDLE hFile = CreateFile(
        strcpy(pDATA[nStgElm].cFileName,szPath), 
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL, 
            OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        uStgLen += (pDATA[nStgElm].nFileSizeLow = GetFileSize(hFile,NULL));
        CloseHandle(hFile);
        nStgElm++;
    }
    else
    {
        if(strcmp(pDATA[nStgElm].cFileName,"") == 0)
           strcpy(pDATA[nStgElm].cFileName,"+");
        sprintf(pFILE_DATA.cFileName,"%s\\*.*",pDATA[nStgElm].cFileName);
        hFile = FindFirstFile(pFILE_DATA.cFileName,&pFILE_DATA);
        if(hFile != INVALID_HANDLE_VALUE)
        {
            iINDENT++;
            pDATA[(uIND = nStgElm)].nFileSizeLow = uStgLen;
            pDATA = (WIN32_FIND_DATA *)realloc
                        (
                            (void *)pDATA,
                            sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                        );
            do
            {
                if(strcmp(pFILE_DATA.cFileName,".")  == 0 ||
                   strcmp(pFILE_DATA.cFileName,"..") == 0)
                    continue;
                else
                {
                    pFILE_DATA.dwReserved1 = iINDENT;
                    pDATA[nStgElm] = pFILE_DATA;
                    sprintf(pDATA[nStgElm].cFileName,"%s\\%s",szPath,pFILE_DATA.cFileName);
                    if(FILE_ATTRIBUTE_DIRECTORY & pFILE_DATA.dwFileAttributes)
                    try
                    {
                        MkPathList(pDATA[nStgElm].cFileName);
                    }
                    catch(...)
                    {
                        iINDENT--;
                        //MessageBox(m_hWnd,strerror(GetLastError()),"ERROR",MB_OK);
                    }
                    else
                    {
                        uStgLen += pFILE_DATA.nFileSizeLow;
                        pDATA = (WIN32_FIND_DATA *)realloc
                                    (
                                        (void *)pDATA,
                                        sizeof(WIN32_FIND_DATA)*(1 + (nStgElm = nStgElm + 1))
                                    );
                    }
                    PumpMessages(m_hWnd);//Избегаю зависания
                }
            }
            while(FindNextFile(hFile,&pFILE_DATA) != 0);
            FindClose(hFile);
            pDATA[uIND].nFileSizeLow = uStgLen - pDATA[uIND].nFileSizeLow;
            iINDENT--;
        }
    }
    return pDATA;
}
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
07.04.2011, 21:54  [ТС]     Бесконечные циклы. #9
понятно, данную программу я уже и так написал, циклы попадались, но даже простой вывод на консоль текста тормозил программу достаточно сильно, что б система не висла.

А вообще странно, в винде при таком раскладе система считает приложение зависшим, а сама себя вполне нормально чувствует. А линукс виснет...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.04.2011, 08:31     Бесконечные циклы. #10
Поставь дополнительный счётчик циклов, на время отладки. Пусть убивает программу если что...
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
08.04.2011, 16:00  [ТС]     Бесконечные циклы. #11
C++
1
2
for(int i=0;i<10;i++)
for(int j=0;j<10;i++)
просто бывают такие банальные ошибки)
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
08.04.2011, 17:05     Бесконечные циклы. #12
Есть такая тулзовина - статический анализатор кода PVS-Studio. Твою ошибку она ловит влет....
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
08.04.2011, 17:25  [ТС]     Бесконечные циклы. #13
Я привел самый банальный пример, ошибки обычно сложнее бывают...
дважды или трижды вложенные циклы, в них так просто ошибиться, особенно если хочешь уменьшить общее количество пробегов по ним...
Думаю в конце мая, как сдам курсовой, выложу я этот код здесь. Может кто найдет возможность оптимизации)
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
08.04.2011, 17:42     Бесконечные циклы. #14
Ну, дык и тулзовина ловит не только эту ошибку, но и массу других.......
Есть еще такая тулза - CppCheck, тоже полезная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2011, 18:28     Бесконечные циклы.
Еще ссылки по теме:

Циклы - C++
Дан номер телевизионного канала(от 1 до 5). Вывести на экран наиболее популярные программы заданного канала.

Циклы в с++ - C++
Как должен выглядеть цикл for с шагом -1?

Циклы - C++
1)Используя перебор значений найти все числа из диапазона от n до m, которые при возведении в квадрат дают палиндром 2)В соревнованиях...

Циклы WHILE, DO-WHILE. - C++
Привет всем. В течении 3ёх часов нужно сдать работу, ни черта не получается, ибо полнейший чайник в программировании :umnik: Может кто...

циклы for, while - C++
for: Среди всех n-значных чисел (n = 1,2,3,4) указать те, сумма цифр которых равна данному числу k. while: Дано натуральное число n....


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

Или воспользуйтесь поиском по форуму:
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
08.04.2011, 18:28  [ТС]     Бесконечные циклы. #15
ладно на след проекте опробую)
а для пхп такого нет??

Добавлено через 22 минуты
Как в той же убунту проверить вся ли выделенная память освождена?
Yandex
Объявления
08.04.2011, 18:28     Бесконечные циклы.
Ответ Создать тему
Опции темы

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