Форум программистов, компьютерный форум 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. Просмотров 2420. Ответов 14
Метки нет (Все метки)

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

Циклы - C++
Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр (операции деления и нахождения...

Циклы for. Проблема объявления/инициализации - C++
Эх, так и придется создавать новую тему. А то, блин, интересно ж... Итак, я тут в недавней теме утверждал, что блок инициализации цикла...

Функции: Разветвляющиеся программы циклы. - C++
Помогите, пожалуйста, нужно найти ошибку в программе, прога пишет при построении, что переменная &quot;max&quot; не является однозначной. ...

циклы - C++ Builder
При расчётах електромагнитной системе реле кривую намагничивания апроксимируют отрезками прямой B=H при 0&lt;=H&lt;=K и B=0,5*H+3 при K&lt;H&lt;=M....

Циклы в С++ - C++ Builder
Доброго времени суток! Я столкнулся с проблемкой, и мне приходится вкладывать циклы друг в друга, в оббщем получилось вот что: ...

Циклы в Image - C++ Builder
Подскажите:Я рисую произвольную фигуры в Image.Как написать цикл который проходил бы по каждой линии Image и если попадал внутрь фигуры...

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

А вообще странно, в винде при таком раскладе система считает приложение зависшим, а сама себя вполне нормально чувствует. А линукс виснет...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.04.2011, 08:31 #10
Поставь дополнительный счётчик циклов, на время отладки. Пусть убивает программу если что...
0
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++)
просто бывают такие банальные ошибки)
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
08.04.2011, 17:05 #12
Есть такая тулзовина - статический анализатор кода PVS-Studio. Твою ошибку она ловит влет....
0
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
08.04.2011, 17:25  [ТС] #13
Я привел самый банальный пример, ошибки обычно сложнее бывают...
дважды или трижды вложенные циклы, в них так просто ошибиться, особенно если хочешь уменьшить общее количество пробегов по ним...
Думаю в конце мая, как сдам курсовой, выложу я этот код здесь. Может кто найдет возможность оптимизации)
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
08.04.2011, 17:42 #14
Ну, дык и тулзовина ловит не только эту ошибку, но и массу других.......
Есть еще такая тулза - CppCheck, тоже полезная.
0
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
08.04.2011, 18:28  [ТС] #15
ладно на след проекте опробую)
а для пхп такого нет??

Добавлено через 22 минуты
Как в той же убунту проверить вся ли выделенная память освождена?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2011, 18:28
Привет! Вот еще темы с ответами:

Циклы с условием окончания - C++ Builder
Всем привет. Задание: исследовать ряд на сходимость. Помогите пожалуйста написать, в голову ничего не идет, с рек. формулами.

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

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

QThread бесконечные циклы - C++ Qt
Всем привет! У меня такой, возможно, глупый вопрос Следующий код: Заголовочные файлы //класс, выдающий сообщение в консоль ...


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

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

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