Командата за превключване на регистър след прекъсване се изпълнява

Имам C Win32 програма

Има функция за манипулиране на съобщения, която има оператори за превключване на регистъра за обработка на съобщения.

Има едно явление, което ме удиви... Ще се опитам да го обясня с прости думи.

switch (Message)
{
case 0:
    printf("Case 0 \n");
    break;
case 1:
    printf("Case 1 \n");
    break;
    printf("After Break Case 1 \n");
case 2:
     switch( WHAT_SC(wParam) ) {
        case 1:
        case 2:
           if (KEYBOARD_UNLOCKED()) {
             defstatus = DefWindowProc(hWnd, iMessage, wParam, lParam);
           }
           break;
        case 3:
           if (bLockWindowSize) {
              return (TRUE);
           }
        default:
            defstatus = DefWindowProc(hWnd, iMessage, wParam, lParam);
            break;
    }
    break;
    HANDLE_MSG(hWnd, WM_COMMAND, Func_OC);
case 3:
    printf("Case 3 \n");
    break;
    printf("After Break Case 3 \n");
default :
    printf("default \n");
    break;
    printf("After Break default \n");
}

(Кодът по-горе е само псевдо код) В даден момент командата след прекъсването се изпълнява. т.е.

 HANDLE_MSG(hWnd, WM_COMMAND, Func_OC);

Защо/как е така?

Благодаря


person Clueless Programmer    schedule 10.06.2014    source източник
comment
Това на версията за отстраняване на грешки или за освобождаване ли е?   -  person cup    schedule 10.06.2014
comment
Не би трябвало, ако предишното прекъсване наистина е относително към външния превключвател (т.е. няма допълнителен for цикъл на нещо подобно). Можете ли да публикувате истинския код?   -  person Nicolas Defranoux    schedule 10.06.2014
comment
Защо имате изявление след break? Компилаторът не даде ли предупреждение за недостижим код? Променете нивото на предупреждение до най-високото ниво (/W4).   -  person doptimusprime    schedule 10.06.2014
comment
псевдокодът не е достатъчен!   -  person zdd    schedule 10.06.2014
comment
Сигурни ли сте, че HANDLE_MSG се изпълнява от този код? Callstack проверява ли това?   -  person doptimusprime    schedule 10.06.2014
comment
Здравейте чаша - Освободете. ~~ Здравей Никълъс - наистина съжалявам, че не мога да го направя, но те уверявам, че няма външен цикъл. ~~ Здравейте dBasic - Не даде предупреждение, но да, ще опитам това (не знам къде е опцията във VS 2008)   -  person Clueless Programmer    schedule 10.06.2014
comment
Здравейте dBasic - Да, стекът на повикванията проверява и моята точка на прекъсване достига.   -  person Clueless Programmer    schedule 10.06.2014
comment
Публикувайте истинския код. Грешката най-вероятно е много тривиална, причинена от измама на изявленията за прекъсване.   -  person Lundin    schedule 10.06.2014
comment
Сигурни ли сте, че този ред се изпълнява или се извиква същата функция от някъде другаде?   -  person dave    schedule 10.06.2014


Отговори (2)


ПРОБЛЕМЪТ СЕ РАЗРЕШИ ...

The

 HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

Изпълнява се тук поради следната причина

HANDLE_MSG( е MACRO. когато погледнах дефиницията на това, виждам следния код в WindowsX.h

 #define HANDLE_MSG(hwnd, message, fn)    \
     case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))

Това, което се случва, е, че макросът HANDLE_MSG в случай на превключване .. се заменя с кода в WindowxS.h

Това действа като друг случай, следователно се изпълнява с връщане.

Благодаря на всички, които се опитаха да ми помогнат.

(Cup и dBase заслужават специални благодарности)

Поздрави :( Безграмотен програмист

person Clueless Programmer    schedule 10.06.2014
comment
Това все още не решава въпроса ви, (горният код е просто псевдо код) В даден момент командата след прекъсването се изпълнява. т.е. HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); - person Vagish; 10.06.2014
comment
Прочетете внимателно въпроса. Командата след прекъсването се изпълнява в моменти ....... т.е. когато това условие е вярно. ДЕЙСТВА като друг случай. - person Clueless Programmer; 10.06.2014
comment
Може да искате да приемете собствения си отговор, така че това се затваря. - person alk; 11.06.2014

Това може да се случи само ако командата break спира всеки цикъл в превключвателя или друг превключвател в превключвателя.

Ако виждаш

 HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

се изпълнява, тогава "случай 3" трябва да се изпълни.

person Vagish    schedule 10.06.2014