мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
1

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

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

Студворк — интернет-сервис помощи студентам
Довольно часто допускаются ошибки приводящие к бесконечным циклам.
Только что такой бесконечный цикл едва не вынудил прервать работу горячей перезагрузкой - компьютер завис почти намертво.
Можно ли как нибудь оградить себя от подобных зависаний системы?
ОС Ubuntu.
Буду благодарен за отклики и предложения.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2011, 20:14
Ответы с готовыми решениями:

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

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

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

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

14
Заблокирован
Автор 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 - дескриптор диалогового окна программы или консоли, вобщем дескриптор окна для которого хочешь сохранить контроль
1
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
06.04.2011, 14:53  [ТС] 3
а не объяснишь ка это может помочь??
0
125 / 105 / 40
Регистрация: 06.03.2011
Сообщений: 334
06.04.2011, 15:09 4
видимо заставляет обрабатывать сообщения даже когда прога висит
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
06.04.2011, 15:14  [ТС] 5
Я встречался уже с функцией PeekMessage, но как ее тут применить?
У меня консольное приложение занимающееся математическими вычислениями...
0
125 / 105 / 40
Регистрация: 06.03.2011
Сообщений: 334
06.04.2011, 15:31 6
подключить библиотеку для работы c WinApi видимо
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
06.04.2011, 15:44  [ТС] 7
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
ОС Ubuntu
Какую там дидлиотеку подключить? WinApi??
0
Заблокирован
Автор 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;
}
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
07.04.2011, 21:54  [ТС] 9
понятно, данную программу я уже и так написал, циклы попадались, но даже простой вывод на консоль текста тормозил программу достаточно сильно, что б система не висла.

А вообще странно, в винде при таком раскладе система считает приложение зависшим, а сама себя вполне нормально чувствует. А линукс виснет...
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
08.04.2011, 08:31 10
Поставь дополнительный счётчик циклов, на время отладки. Пусть убивает программу если что...
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
08.04.2011, 16:00  [ТС] 11
C++
1
2
for(int i=0;i<10;i++)
for(int j=0;j<10;i++)
просто бывают такие банальные ошибки)
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
08.04.2011, 17:05 12
Есть такая тулзовина - статический анализатор кода PVS-Studio. Твою ошибку она ловит влет....
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
08.04.2011, 17:25  [ТС] 13
Я привел самый банальный пример, ошибки обычно сложнее бывают...
дважды или трижды вложенные циклы, в них так просто ошибиться, особенно если хочешь уменьшить общее количество пробегов по ним...
Думаю в конце мая, как сдам курсовой, выложу я этот код здесь. Может кто найдет возможность оптимизации)
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
08.04.2011, 17:42 14
Ну, дык и тулзовина ловит не только эту ошибку, но и массу других.......
Есть еще такая тулза - CppCheck, тоже полезная.
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
08.04.2011, 18:28  [ТС] 15
ладно на след проекте опробую)
а для пхп такого нет??

Добавлено через 22 минуты
Как в той же убунту проверить вся ли выделенная память освождена?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2011, 18:28
Помогаю со студенческими работами здесь

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

Заменить в коде циклы for на циклы while
int i, j, n; bool a; cin &gt;&gt; i &gt;&gt; n; for (i; i&lt;n; i++) { a = true; for (j = 2; j &lt;= i / 2;...

Бесконечные циклы
Нужно написать два скрипта с бесконечными циклами. Приведите пример бесконечных циклов.

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru