Можете ли вы расшифровать разницу между этим ключом () и эквивалентом для ()? - PullRequest
1 голос
/ 18 июля 2010

Этот работает как задумано:

    if (clu.raw.butsnum) {
        int i;
        for (i=0;i<clu.raw.butsnum;i++){
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_1_DOWN)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qtrue, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_2_DOWN)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE2, qtrue, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_3_DOWN)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE3, qtrue, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_4_DOWN)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE4, qtrue, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_5_DOWN)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE5, qtrue, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_1_UP)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE1, qfalse, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_2_UP)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE2, qfalse, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_3_UP)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE3, qfalse, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_4_UP)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE4, qfalse, 0, NULL );
            if (clu.raw.buts[i] & RI_MOUSE_BUTTON_5_UP)
                Com_QueueEvent( 0, SE_KEY, K_MOUSE5, qfalse, 0, NULL );
        }
        clu.raw.butsnum = 0;

но этот,

if (clu.raw.butsnum) {
        short int   down        = qfalse;
        int         but = 0, i;

        for (i = 0; i < clu.raw.butsnum; i++) {
            switch( clu.raw.buts[i]) {
                case     RI_MOUSE_BUTTON_1_DOWN:        down = qtrue;   but = K_MOUSE1; break;
                case     RI_MOUSE_BUTTON_2_DOWN:        down = qtrue;   but = K_MOUSE2; break;
                case     RI_MOUSE_BUTTON_3_DOWN:        down = qtrue;   but = K_MOUSE3; break;
                case     RI_MOUSE_BUTTON_4_DOWN:        down = qtrue;   but = K_MOUSE4; break;
                case     RI_MOUSE_BUTTON_5_DOWN:        down = qtrue;   but = K_MOUSE5; break;
                case     RI_MOUSE_BUTTON_1_UP:      down = qfalse;  but = K_MOUSE1; break;
                case     RI_MOUSE_BUTTON_2_UP:      down = qfalse;  but = K_MOUSE2; break;
                case     RI_MOUSE_BUTTON_3_UP:      down = qfalse;  but = K_MOUSE3; break;
                case     RI_MOUSE_BUTTON_4_UP:      down = qfalse;  but = K_MOUSE4; break;
                case     RI_MOUSE_BUTTON_5_UP:      down = qfalse;  but = K_MOUSE5; break;
            }
            Com_QueueEvent( 0, SE_KEY, but, down, 0, NULL );
        }
    }
    clu.raw.butsnum = 0;

.. иногда "теряет его", и если некоторые из "кнопок мыши" (в этом коде) не нажимаются, если они нажимаются слишком быстро.

Во всяком случае, актуальность самого кода, я думаю, мала.

Почему эти фрагменты кода не делают одно и то же?

Ответы [ 4 ]

8 голосов
/ 18 июля 2010

Переключатель похож на запись

if ( clu.raw.buts[i] == VALUE )

, который отличается от

if ( clu.raw.buts[i] & VALUE ) 

Ясно, что первое «ловит» VALUE, если это единственное событие, хранящееся в clu.raw.buts[i]. Вместо этого все RI_stuffs являются битами или отредактированы в clu.raw.buts[i], поэтому единственный способ увидеть, установлены ли они (в 1) или очищены (0), это оператор & (побитовый и).

например. если clu.raw.buts[i] - 0100, а VALUE - 0100, вы его поймаете. Если clu.raw.buts[i] равно 0110, вы не увидите «0100» с помощью ==, а «1014 *».

3 голосов
/ 18 июля 2010

С помощью if вы изучаете каждый отдельный бит. С помощью переключателя вы эффективно просматриваете все биты ИЛИ вместе, так что ни один отдельный случай никогда не попадет.

3 голосов
/ 18 июля 2010

Код # 1 позволяет нескольким битам в записи clu.raw.buts[i] быть 1, используя двоичный оператор AND и проверяя каждый бит отдельно.

Код # 2 допускает, чтобы только один бит был 1 (поскольку он сравнивается с конкретным значением case s в select), что исключает случаи, когда два или более события происходят одновременно.

1 голос
/ 18 июля 2010

С версией коммутатора только один случай может быть сопоставлен за итерацию.В версии if каждый оператор оценивается по очереди, а это означает, что более одного из операторов может выполняться на каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...