Re[14]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 31.05.02 07:44
Оценка: :)
Здравствуйте The Lex, Вы писали:

TL>Здравствуйте Patalog, Вы писали:


P>>Здравствуйте The Lex, Вы писали:


TL>>>Здравствуйте Patalog, Вы писали:


P>>>>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


TL>>>Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...


P>>Принеси песочку, родной... (с) Киндза-дза.


TL>Ку-у-у


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

P>>Не хочешь разводить флейм — не разводи. Тред плавно перешел на _стиль_ написания программ, что как заметил Vlad, может представлять определенный интере. А про класс начал не я, ежели ты вдруг не заметил.


P>>Ежели прога кривая, ее конечно нужно сопровождать, поддерживать и модифицировать. Сие не означает, что хорошую прогу не надо сопровождать etc., это к тому, что при прочих равных, класс выше у того у кого работает, а не у того кто круче заплатки клепает.


TL>"Заплатки клепать" приходится в любом случае. И чем проще "клепать заплатки", тем лучше. Причем "клепать заплатки" не всегда приходится тому же, кто "хорошую прогу" писал.


Ну, не знаю мне пока не приходилось... В смысле именно заплатки. Модифицировать — да. Чем проще, тем лучше — с этим никто не спорит. Это лмшь говорит о грамотности проектирования.

TL>Так что: обсудим, у кого же "класс выше"? Т.е. методы определения "высоты класса".


А енто теперь так называется? Раньше вроде пиписками мерялись...

Не, ну так точно флейм получится А определения "высоты класса" у меня нет. Может спросить у Vlad'a? Имхо, он сказал что чем выше класс, тем меньше goto.

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

P>>ЗЫж Жаль сдесь твита нет...


TL>Мне тоже жаль. А кто это?


Да так приятель один... Они обычно вместе с голым дедом ходят
Почетный кавалер ордена Совка.
Re[6]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.02 11:29
Оценка:
Здравствуйте VladD2, Вы писали:

Приношу свои извинения. Забыл поставить [code].

Привожу код еще раз.

for(;;)
{
  for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; 
             pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
}



Такое решение позволяет читающему код легко понять принцип работы программы...

P>IMHO, ежели у кого-то возникают проблемы с чтением этого кода, енто личные проблемы этого кого-то.


Именно проблемы. Но не личные. Личные проблемы начинаются у программиста который пишит такой код... ну, когда он хочет устроиться на работу в контору где ему придется работать в команде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.02 11:33
Оценка: 1 (1)
Здравствуйте The Lex, Вы писали:

P>>Практика показывает, что класс выше у того, у кого лучше работает прога (в смысле правильно работает и не подает). Про срок разработки пока скромно умолчим...


TL>Да ну?! А как насчет сопровождения, поддержки, модификации и т.д. и т.п.? Не будем разводить флейм на тему — это банально и много раз поднималось здесь и не только здесь...


2ALL:

Я теперь все кому не зслужено, или в отместку ноль залепили буду самую высокую оценку довать. Даже если ответ и не выдающийся, а просто верный. Так что перед тем как сделать пакость, человеку луше подумать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 31.05.02 20:01
Оценка: 6 (1)
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте VladD2, Вы писали:


VD>Приношу свои извинения. Забыл поставить [code].


VD>Привожу код еще раз.


VD>
VD>for(;;)
VD>{
VD>  for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; 
VD>             pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
VD>  {
VD>    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
VD>    {
VD>       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
VD>                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
VD>       if(nRes != CCB_ERR_NOERROR)
VD>       {
VD>            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
VD>            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
VD>            //Передается юзеру, который должен как-то отреагировать на ошибку
VD>            nCallBackRes = pCheckControl->DoControl(nRes); 
VD>            nErrorCount++;
VD>            
VD>            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
VD>               continue; //OK, продолжаем дальше
VD>            else if(nCallBackRes == CCB_RES_ABORT) 
VD>               return nErrorCount; //Failed, отмена
VD>            else 
VD>               //Юзер попытался исправить ошибку, надо проверить заново
VD>               break;
VD>       }
VD>   }
VD>}
VD>





Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

Можно так:
for(;;)
{
  for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; 
             pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
    if(pRecord3 == NULL)break;
}


Но это лишние извраты!
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Выйти из двух циклов сразу
От: George_Seryakov Россия  
Дата: 31.05.02 20:38
Оценка: 2 (1)
Здравствуйте LeonGorbachev, Вы писали:

Еще вариант:

void a_function(..) {
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
         return;
LG>  }
LG>}
}
GS
Re: Выйти из двух циклов сразу
От: Syber  
Дата: 31.05.02 22:46
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?



Вообщем так! Я толком не понял куда тебе нужно выйти, попробуй break;
или return 0; при втором он выйдет вообще, но если хорошо обработать очень даже ничего получается!
Re: Выйти из двух циклов сразу
От: Syber  
Дата: 31.05.02 22:52
Оценка:
Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!
Re[2]: Выйти из двух циклов сразу
От: IT Россия linq2db.com
Дата: 31.05.02 23:33
Оценка:
Здравствуйте Syber, Вы писали:

LG>>Как это сделать?


S>Вообщем так! Я толком не понял куда тебе нужно выйти, попробуй break;


Мда... почитал бы тогда всю ветку тогда, что ли

S>или return 0; при втором он выйдет вообще, но если хорошо обработать очень даже ничего получается!


А почему не return 1?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 01.06.02 07:40
Оценка: -2
Здравствуйте Syber, Вы писали:

S>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    HANDLE    mutex_lock=NULL;
    MSG        msg;
    char *s=NULL;
    char st[1000];

    msg.wParam=1;
    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
    if(GetLastError()==ERROR_ALREADY_EXISTS)
        goto st_app_already_exists;
    if(mutex_lock==NULL)goto st_fail;

    app_hInstance = hInst;

    WNDCLASS wnd_class;

    wnd_class.style=            CS_PARENTDC;
    wnd_class.lpfnWndProc=        WndProc;
    wnd_class.cbClsExtra=        0;
    wnd_class.cbWndExtra=        0;
    wnd_class.hInstance=        app_hInstance;
    wnd_class.hIcon=            NULL;
    wnd_class.hCursor=            NULL;
    wnd_class.hbrBackground=    NULL;
    wnd_class.lpszMenuName=        NULL;
    wnd_class.lpszClassName=    app_wnd_class_name;

    if(!RegisterClass(&wnd_class))goto st_fail;

    app_hWnd = CreateWindow(
        app_wnd_class_name, app_window_name,WS_POPUP,
        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
        NULL,    NULL,    app_hInstance,    NULL
    );

    if(app_hWnd==NULL)goto st_fail;

    ShowWindow(app_hWnd, SW_SHOW);
    SetCursor(LoadCursor(NULL, IDC_ARROW));
    ShowCursor(TRUE);

    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
    if(!app_timer)goto st_fail;

    app_ready=1;
st_message_loop:
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
    if(app_active&&app_ready)goto st_work;
    WaitMessage();
    goto st_message_loop;
st_check_message:
    if(msg.message==WM_QUIT)goto st_quit;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    goto st_message_loop;
st_work:
//=====================================================================
//...
//=====================================================================
    goto st_message_loop;
st_fail:
    if(app_timer)            KillTimer(app_hWnd, app_timer);
    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
st_quit:
st_app_already_exists:
    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
    return msg.wParam;
}


Да если кто-то код не разобрал спршивайте не стесняйтесь.
ЗЫ жаль оценки -10 нету.
ЗЗЫ извините вырвалось.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Выйти из двух циклов сразу
От: Chorkov Россия  
Дата: 01.06.02 08:57
Оценка: 8 (1)
Здравствуйте WolfHound, Вы писали:

WH>Здравствуйте Syber, Вы писали:


S>>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.


WH>
WH>int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
WH>{
WH>    HANDLE    mutex_lock=NULL;
WH>    MSG        msg;
WH>    char *s=NULL;
WH>    char st[1000];

WH>    msg.wParam=1;
WH>    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
WH>    if(GetLastError()==ERROR_ALREADY_EXISTS)
WH>        goto st_app_already_exists;
WH>    if(mutex_lock==NULL)goto st_fail;

WH>    app_hInstance = hInst;

WH>    WNDCLASS wnd_class;

WH>    wnd_class.style=            CS_PARENTDC;
WH>    wnd_class.lpfnWndProc=        WndProc;
WH>    wnd_class.cbClsExtra=        0;
WH>    wnd_class.cbWndExtra=        0;
WH>    wnd_class.hInstance=        app_hInstance;
WH>    wnd_class.hIcon=            NULL;
WH>    wnd_class.hCursor=            NULL;
WH>    wnd_class.hbrBackground=    NULL;
WH>    wnd_class.lpszMenuName=        NULL;
WH>    wnd_class.lpszClassName=    app_wnd_class_name;

WH>    if(!RegisterClass(&wnd_class))goto st_fail;

WH>    app_hWnd = CreateWindow(
WH>        app_wnd_class_name, app_window_name,WS_POPUP,
WH>        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
WH>        NULL,    NULL,    app_hInstance,    NULL
WH>    );

WH>    if(app_hWnd==NULL)goto st_fail;

WH>    ShowWindow(app_hWnd, SW_SHOW);
WH>    SetCursor(LoadCursor(NULL, IDC_ARROW));
WH>    ShowCursor(TRUE);

WH>    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
WH>    if(!app_timer)goto st_fail;

WH>    app_ready=1;
WH>st_message_loop:
WH>    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
WH>    if(app_active&&app_ready)goto st_work;
WH>    WaitMessage();
WH>    goto st_message_loop;
WH>st_check_message:
WH>    if(msg.message==WM_QUIT)goto st_quit;
WH>    TranslateMessage(&msg);
WH>    DispatchMessage(&msg);
WH>    goto st_message_loop;
WH>st_work:
WH>//=====================================================================
WH>//...
WH>//=====================================================================
WH>    goto st_message_loop;
WH>st_fail:
WH>    if(app_timer)            KillTimer(app_hWnd, app_timer);
WH>    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
WH>st_quit:
WH>st_app_already_exists:
WH>    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
WH>    return msg.wParam;
WH>}

WH>



ЭТО может выглядеть так:

class CAutoMutex
{
public:
    HANDLE H;
    inline CAutoMutex(void) 
        : H(NULL)
    {;};
    inline CAutoMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName)
        : H(CreateMutex(lpMutexAttributes,bInitialOwner,lpName))
    {;};

    inline ~CAutoMutex(void) 
    { 
        if(H!=NULL) 
            CloseHandle(H); 
    };

    inline operator HANDLE(void) const 
        {return H;};
    inline HANDLE operator =(const HANDLE& H2)
        {return H=H2;};
};

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    MSG        msg;
    char *s=NULL;
    char st[1000];
    WNDCLASS wnd_class;
    msg.wParam=1;

    CAutoMutex mutex_lock(NULL, FALSE, "SomeApp mutex_lock");

    if(GetLastError()==ERROR_ALREADY_EXISTS)
        return msg.wParam;

    try
    {
        if((HANDLE)mutex_lock==NULL) throw NULL; 

        app_hInstance = hInst;


        wnd_class.style=            CS_PARENTDC;
        wnd_class.lpfnWndProc=        WndProc;
        wnd_class.cbClsExtra=        0;
        wnd_class.cbWndExtra=        0;
        wnd_class.hInstance=        app_hInstance;
        wnd_class.hIcon=            NULL;
        wnd_class.hCursor=            NULL;
        wnd_class.hbrBackground=    NULL;
        wnd_class.lpszMenuName=        NULL;
        wnd_class.lpszClassName=    app_wnd_class_name;


        if(!RegisterClass(&wnd_class)) throw NULL;

        app_hWnd = CreateWindow(
            app_wnd_class_name, app_window_name,WS_POPUP,
            0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
            NULL,    NULL,    app_hInstance,    NULL
        );

        if(app_hWnd==NULL) throw NULL;

        ShowWindow(app_hWnd, SW_SHOW);
        SetCursor(LoadCursor(NULL, IDC_ARROW));
        ShowCursor(TRUE);

        app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
        if(!app_timer) throw NULL; 

        app_ready=1;

        for(;;)
            if(!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                if(msg.message==WM_QUIT) 
                    return msg.wParam;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
                if(!(app_active&&app_ready))
                    WaitMessage();

    }
    catch(...)
    {
        if(app_timer)            KillTimer(app_hWnd, app_timer);
        if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
    };
    return msg.wParam;
}

P.S. Самозакрывающиеся хаднлеры лучьше использовать стандартные (из WTL или MFC), но я привык к своим, поэтомы так и написал.
Тоже верно и для исключений
Re[2]: Выйти из двух циклов сразу
От: Dwarf Россия dwarf.h1.ru
Дата: 01.06.02 10:11
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте LeonGorbachev, Вы писали:


GS>Еще вариант:


GS>
GS>void a_function(..) {
LG>>while(1)
LG>>{
LG>>  for(int i = 0; i < 100; i++)
LG>>  {
LG>>    if(i == 77)
LG>>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
GS>         return;
LG>>  }
LG>>}
GS>}
GS>


Имхо, это самый удобный и надежный способ
Народу не нужны нездоровые сенсации. Народу нужны здоровые сенсации! (с) Стругацкие.
Re[8]: Выйти из двух циклов сразу
От: Patalog Россия  
Дата: 02.06.02 08:53
Оценка:
Здравствуйте WolfHound, Вы писали:

[skip]


WH>

WH>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

Зато "Такое решение позволяет читающему код легко понять принцип работы программы... "
Почетный кавалер ордена Совка.
Re[3]: Выйти из двух циклов сразу
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 02.06.02 09:04
Оценка: 20 (2)
Здравствуйте WolfHound, Вы писали:

WH>Здравствуйте Syber, Вы писали:


S>>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.


WH>
WH>int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
WH>{
WH>    HANDLE    mutex_lock=NULL;
WH>    MSG        msg;
WH>    char *s=NULL;
WH>    char st[1000];

WH>    msg.wParam=1;
WH>    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
WH>    if(GetLastError()==ERROR_ALREADY_EXISTS)
WH>        goto st_app_already_exists;
WH>    if(mutex_lock==NULL)goto st_fail;

WH>    app_hInstance = hInst;

WH>    WNDCLASS wnd_class;

WH>    wnd_class.style=            CS_PARENTDC;
WH>    wnd_class.lpfnWndProc=        WndProc;
WH>    wnd_class.cbClsExtra=        0;
WH>    wnd_class.cbWndExtra=        0;
WH>    wnd_class.hInstance=        app_hInstance;
WH>    wnd_class.hIcon=            NULL;
WH>    wnd_class.hCursor=            NULL;
WH>    wnd_class.hbrBackground=    NULL;
WH>    wnd_class.lpszMenuName=        NULL;
WH>    wnd_class.lpszClassName=    app_wnd_class_name;

WH>    if(!RegisterClass(&wnd_class))goto st_fail;

WH>    app_hWnd = CreateWindow(
WH>        app_wnd_class_name, app_window_name,WS_POPUP,
WH>        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
WH>        NULL,    NULL,    app_hInstance,    NULL
WH>    );

WH>    if(app_hWnd==NULL)goto st_fail;

WH>    ShowWindow(app_hWnd, SW_SHOW);
WH>    SetCursor(LoadCursor(NULL, IDC_ARROW));
WH>    ShowCursor(TRUE);

WH>    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
WH>    if(!app_timer)goto st_fail;

WH>    app_ready=1;
WH>st_message_loop:
WH>    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
WH>    if(app_active&&app_ready)goto st_work;
WH>    WaitMessage();
WH>    goto st_message_loop;
WH>st_check_message:
WH>    if(msg.message==WM_QUIT)goto st_quit;
WH>    TranslateMessage(&msg);
WH>    DispatchMessage(&msg);
WH>    goto st_message_loop;
WH>st_work:
WH>//=====================================================================
WH>//...
WH>//=====================================================================
WH>    goto st_message_loop;
WH>st_fail:
WH>    if(app_timer)            KillTimer(app_hWnd, app_timer);
WH>    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
WH>st_quit:
WH>st_app_already_exists:
WH>    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
WH>    return msg.wParam;
WH>}

WH>


Интересно, почему мне намного больше нравится следующий код?
И почему очень не нравится предыдущий код, особенно, если бы его писал мой подчиненный...
struct IdleHandler
{
  void OnIdle ()
  {
  //бывший st_work:;
  }
};
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
  try
  {
  CMutex mutex_lock (NULL, FALSE, "Some App MutexLock");
  if(GetLastError()==ERROR_ALREADY_EXISTS)
    return 1;
  CWindow main_wnd;
  if (main_wnd.CreateWindow(
        app_wnd_class_name, app_window_name,WS_POPUP,
        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN)
    )
    return 1;

  CMessageLoop theLoop;
  _Module.AddMessageLoop(&theLoop);
  IdleHandler idle_handler;
  theLoop.AddIdleHandler (&idle_handler);

  CTimer timer (main_wnd,APP_TIMER_ID,1000/60,NULL);
  theLoop.Run();
  }
  catch(...)
  {
    return 1;
  }
}


WH>Да если кто-то код не разобрал спршивайте не стесняйтесь.

WH>ЗЫ жаль оценки -10 нету.
WH>ЗЗЫ извините вырвалось.

ИМХО, с таким стилем кода сложно писать большие приложения.
Re[4]: Выйти из двух циклов сразу
От: Dwarf Россия dwarf.h1.ru
Дата: 02.06.02 12:26
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>ИМХО, с таким стилем кода сложно писать большие приложения.


Windows например
Народу не нужны нездоровые сенсации. Народу нужны здоровые сенсации! (с) Стругацкие.
Re[4]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 02.06.02 18:33
Оценка: -1
Здравствуйте DarkGray, Вы писали:

DG>Интересно, почему мне намного больше нравится следующий код?

А мне нет особенно после того как я вспоминаю про скрытый код о котором (кроме интерфейса) я ни чего не знаю.
DG>И почему очень не нравится предыдущий код, особенно, если бы его писал мой подчиненный...
И почему-бы я не стал работать на босса которого интересует как выглядит мой код, а не то как он работает.

DG>ИМХО, с таким стилем кода сложно писать большие приложения.

Просто особенно после того как автокомментирование врубается.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Выйти из двух циклов сразу
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.02 08:53
Оценка:
Здравствуйте WolfHound, Вы писали:

WH>

WH>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

Вообще-то моя задача была дать общую идею. Ну, да ладно, перепишим эквивалентно:


for(SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord; pRecord3;)
{
  for(;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
}



WH>Можно так: ...

WH>Но это лишние извраты!

Да в твоем случае дейсвтительно лишние извраты.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Выйти из двух циклов сразу
От: flyker Россия  
Дата: 03.06.02 12:46
Оценка: 6 (1)
Здравствуйте WolfHound, Вы писали:

WH>Здравствуйте Syber, Вы писали:


S>>Даааа забыл теюе сказать что использование GOTO крайне нежелательно, и если ты куль программер, то забудь енто слово или непоказывай никому исходники с GOTO, давно уже доказано, что без GOTO обойтись в любом случае можно!!!


WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.


WH>
WH>int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
WH>{
WH>    HANDLE    mutex_lock=NULL;
WH>    MSG        msg;
WH>    char *s=NULL;
WH>    char st[1000];

WH>    msg.wParam=1;
WH>    mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
WH>    if(GetLastError()==ERROR_ALREADY_EXISTS)
WH>        goto st_app_already_exists;
WH>    if(mutex_lock==NULL)goto st_fail;

WH>    app_hInstance = hInst;

WH>    WNDCLASS wnd_class;

WH>    wnd_class.style=            CS_PARENTDC;
WH>    wnd_class.lpfnWndProc=        WndProc;
WH>    wnd_class.cbClsExtra=        0;
WH>    wnd_class.cbWndExtra=        0;
WH>    wnd_class.hInstance=        app_hInstance;
WH>    wnd_class.hIcon=            NULL;
WH>    wnd_class.hCursor=            NULL;
WH>    wnd_class.hbrBackground=    NULL;
WH>    wnd_class.lpszMenuName=        NULL;
WH>    wnd_class.lpszClassName=    app_wnd_class_name;

WH>    if(!RegisterClass(&wnd_class))goto st_fail;

WH>    app_hWnd = CreateWindow(
WH>        app_wnd_class_name, app_window_name,WS_POPUP,
WH>        0,    0,    GetSystemMetrics(SM_CXSCREEN),    GetSystemMetrics(SM_CYSCREEN),
WH>        NULL,    NULL,    app_hInstance,    NULL
WH>    );

WH>    if(app_hWnd==NULL)goto st_fail;

WH>    ShowWindow(app_hWnd, SW_SHOW);
WH>    SetCursor(LoadCursor(NULL, IDC_ARROW));
WH>    ShowCursor(TRUE);

WH>    app_timer = SetTimer(app_hWnd,APP_TIMER_ID,1000/60,NULL);
WH>    if(!app_timer)goto st_fail;

WH>    app_ready=1;
WH>st_message_loop:
WH>    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))goto st_check_message;
WH>    if(app_active&&app_ready)goto st_work;
WH>    WaitMessage();
WH>    goto st_message_loop;
WH>st_check_message:
WH>    if(msg.message==WM_QUIT)goto st_quit;
WH>    TranslateMessage(&msg);
WH>    DispatchMessage(&msg);
WH>    goto st_message_loop;
WH>st_work:
WH>//=====================================================================
WH>//...
WH>//=====================================================================
WH>    goto st_message_loop;
WH>st_fail:
WH>    if(app_timer)            KillTimer(app_hWnd, app_timer);
WH>    if(app_hWnd!=NULL)        DestroyWindow(app_hWnd);
WH>st_quit:
WH>st_app_already_exists:
WH>    if(mutex_lock!=NULL)    CloseHandle(mutex_lock);
WH>    return msg.wParam;
WH>}

WH>


WH>Да если кто-то код не разобрал спршивайте не стесняйтесь.

WH>ЗЫ жаль оценки -10 нету.
WH>ЗЗЫ извините вырвалось.

Мдя... Неужели ТАК еще кто то пишет...
Все гениальное — просто
Re: Выйти из двух циклов сразу
От: Alex_st Россия  
Дата: 03.06.02 13:39
Оценка:
Здравствуйте LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


ну например так:
засовываеш циклы в отдельную ф-ю и отлично выходиш
void f()
{
  while(1)
  {
    for(int i = 0; i < 100; i++)
    {
      if(i == 77)
      return;
      // вот тут хочу выйти вообще из всех циклов - из  for и из while
    }
  }
}
Re[9]: Выйти из двух циклов сразу
От: WolfHound  
Дата: 03.06.02 18:37
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте WolfHound, Вы писали:


WH>>

WH>>Код НЕ ЭКВИВАЛЕНТЕН оригиналу!
WH>>Тк в оригинале при pRecord3 == NULL цикл закончится, а в вашем случяе начнется заново.

VD>Вообще-то моя задача была дать общую идею. Ну, да ладно, перепишим эквивалентно:



do
{
  for((SDirectoryRecord* pRecord3 = pRecord1->m_pFirstRecord;pRecord3 != NULL; pRecord3 = pRecord3->m_pNextDirectory) 
  {
    if(pRecord3 != pRecord2 && pRecord2->m_nLevel == pRecord3->m_nLevel) 
    {
       nRes = CompareRecord(pRecord2, pRecord3, nType) == 0 
                ? CCB_ERR_EQUAL_ID : CCB_ERR_NOERROR;
       if(nRes != CCB_ERR_NOERROR)
       {
            pCheckControl->m_data1 = reinterpret_cast<long>(pRecord2);
            pCheckControl->m_data2 = reinterpret_cast<long>(pRecord3);
            //Передается юзеру, который должен как-то отреагировать на ошибку
            nCallBackRes = pCheckControl->DoControl(nRes); 
            nErrorCount++;
            
            if(nCallBackRes == CCB_RES_MAKEAUTO || nCallBackRes == CCB_RES_IGNORE) 
               continue; //OK, продолжаем дальше
            else if(nCallBackRes == CCB_RES_ABORT) 
               return nErrorCount; //Failed, отмена
            else 
               //Юзер попытался исправить ошибку, надо проверить заново
               break;
       }
   }
}
while(pRecord3 != NULL);



WH>>Можно так: ...

WH>>Но это лишние извраты!

VD>Да в твоем случае дейсвтительно лишние извраты.


Можно и так, но как писать это ЛИЧНОЕ дело программиста и пытаться изменить стиль того чьи программы РАБОТАЮТ это ВРЕДНАЯ трата времени.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Выйти из двух циклов сразу
От: LeonGorbachev Россия  
Дата: 03.06.02 18:48
Оценка: -1
Здравствуйте WolfHound, Вы писали:

WH>Вы себя самым умным считаете? Тогда перепишите это без goto и покажите как это будет выглядеть.

Самым умным я себя не считаю, но глядя на твой паршивый (извините за такое выражение) код, я вылез после душа
и не смог удержаться и не переписать его.
В общем-то вот такой код я считаю более читабельным и более правильным...

// -----------------------------------
// LeonGorbachev 04.06.2002 / 23:38:32
typedef enum 
{
    ERR_ST_FAIL,
    ERR_ST_QUIT,
    ERR_ST_ALREADY_EXIST,
} _ST_ERRORS;

void _check_mess(MSG *pmsg)
{
    if(pmsg->message == WM_QUIT)
        throw ERR_ST_QUIT;
    TranslateMessage(pmsg);
    DispatchMessage(pmsg);
}

void _work()
{
    //=====================================================================
    //...
    //=====================================================================
}

void _message_loop(MSG *pmsg)
{
    while(1)
    {
        if(PeekMessage(pmsg, NULL, 0, 0, PM_REMOVE))
            _check_mess(pmsg);
        if(app_active && app_ready)
            _work();
        WaitMessage();
    }
}

int APIENTRY WinMainEx(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    HANDLE    mutex_lock=NULL;
    MSG        msg;
    char *s=NULL;
    char st[1000];
    try
    {
        msg.wParam=1;
        mutex_lock=CreateMutex(NULL, FALSE, "SomeApp mutex_lock");
        if(GetLastError()==ERROR_ALREADY_EXISTS)
            throw ERR_ST_ALREADY_EXIST;
        if(mutex_lock==NULL)
            throw ERR_ST_FAIL;
        app_hInstance = hInst;
        WNDCLASS wnd_class;
        wnd_class.style=            CS_PARENTDC;
        wnd_class.lpfnWndProc=      WndProc;
        wnd_class.cbClsExtra=       0;
        wnd_class.cbWndExtra=       0;
        wnd_class.hInstance=        app_hInstance;
        wnd_class.hIcon=            NULL;
        wnd_class.hCursor=            NULL;
        wnd_class.hbrBackground=    NULL;
        wnd_class.lpszMenuName=     NULL;
        wnd_class.lpszClassName=    app_wnd_class_name;
        if(!RegisterClass(&wnd_class))
            throw ERR_ST_FAIL;
        app_hWnd = CreateWindow(app_wnd_class_name,
            app_window_name,WS_POPUP,
            0,    0,    GetSystemMetrics(SM_CXSCREEN),
            GetSystemMetrics(SM_CYSCREEN),
            NULL,    NULL,    app_hInstance,    NULL
            );
        if(app_hWnd==NULL)
            throw ERR_ST_FAIL;
        ShowWindow(app_hWnd, SW_SHOW);
        SetCursor(LoadCursor(NULL, IDC_ARROW));
        ShowCursor(TRUE);
        app_timer = SetTimer(app_hWnd, APP_TIMER_ID, 1000/60, NULL);
        if(!app_timer)
            throw ERR_ST_FAIL;
        app_ready = 1;
        _message_loop(&msg);
    }
    catch(_ST_ERRORS err)
    {
        switch(err)
        {
        case ERR_ST_FAIL:
            {
                if(app_timer)
                    KillTimer(app_hWnd, app_timer);
                if(app_hWnd != NULL)
                    DestroyWindow(app_hWnd);
            }
        case ERR_ST_QUIT:
            {
            }
        case ERR_ST_ALREADY_EXIST:
            {
                if(mutex_lock!=NULL)
                    CloseHandle(mutex_lock);
            }
        }
    return msg.wParam;
    }
    catch(...)
    {
        return -1;
    }
    return 0;
}
// -----------------------------------


А по поводу работодателя, который смотрит в код —
чесно говоря, я бы такого работника достаточно быстро уволил бы... хотя это мое ИМХО
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.