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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
05.04.2011, 20:14     Бесконечные циклы. #1
Довольно часто допускаются ошибки приводящие к бесконечным циклам.
Только что такой бесконечный цикл едва не вынудил прервать работу горячей перезагрузкой - компьютер завис почти намертво.
Можно ли как нибудь оградить себя от подобных зависаний системы?
ОС Ubuntu.
Буду благодарен за отклики и предложения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2011, 20:14     Бесконечные циклы.
Посмотрите здесь:

Библиотека gmp.h, бесконечные числа C++
C++ бесконечные последовательности
C++ Циклы
Циклы C++
C++ Циклы
C++ циклы
Бесконечные адреса одной переменной. МоСК кипит... C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
06.04.2011, 14:53  [ТС]     Бесконечные циклы. #3
а не объяснишь ка это может помочь??
StagnantIce
 Аватар для StagnantIce
122 / 102 / 1
Регистрация: 06.03.2011
Сообщений: 334
06.04.2011, 15:09     Бесконечные циклы. #4
видимо заставляет обрабатывать сообщения даже когда прога висит
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
06.04.2011, 15:14  [ТС]     Бесконечные циклы. #5
Я встречался уже с функцией PeekMessage, но как ее тут применить?
У меня консольное приложение занимающееся математическими вычислениями...
StagnantIce
 Аватар для StagnantIce
122 / 102 / 1
Регистрация: 06.03.2011
Сообщений: 334
06.04.2011, 15:31     Бесконечные циклы. #6
подключить библиотеку для работы c WinApi видимо
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 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
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
07.04.2011, 21:54  [ТС]     Бесконечные циклы. #9
понятно, данную программу я уже и так написал, циклы попадались, но даже простой вывод на консоль текста тормозил программу достаточно сильно, что б система не висла.

А вообще странно, в винде при таком раскладе система считает приложение зависшим, а сама себя вполне нормально чувствует. А линукс виснет...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.04.2011, 08:31     Бесконечные циклы. #10
Поставь дополнительный счётчик циклов, на время отладки. Пусть убивает программу если что...
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 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
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,315
08.04.2011, 17:05     Бесконечные циклы. #12
Есть такая тулзовина - статический анализатор кода PVS-Studio. Твою ошибку она ловит влет....
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
08.04.2011, 17:25  [ТС]     Бесконечные циклы. #13
Я привел самый банальный пример, ошибки обычно сложнее бывают...
дважды или трижды вложенные циклы, в них так просто ошибиться, особенно если хочешь уменьшить общее количество пробегов по ним...
Думаю в конце мая, как сдам курсовой, выложу я этот код здесь. Может кто найдет возможность оптимизации)
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,315
08.04.2011, 17:42     Бесконечные циклы. #14
Ну, дык и тулзовина ловит не только эту ошибку, но и массу других.......
Есть еще такая тулза - CppCheck, тоже полезная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2011, 18:28     Бесконечные циклы.
Еще ссылки по теме:

Бесконечные суммы C++
C++ циклы
Циклы while do.while C++
Заменить в коде циклы for на циклы while C++
Бесконечные суммы C++

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

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

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

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