Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Operator | w argumentach funkcji

Ostatnio zmodyfikowano 2012-11-14 12:10
Autor Wiadomość
starter
Temat założony przez niniejszego użytkownika
[C++] Operator | w argumentach funkcji
» 2012-11-06 15:56:41
Mam pytanie, jak używać operatora
|
 w argumentach funkcji?
Mam załóżmy funkcje
CreateWindow( std::string text, Keys key_conf );
i typ wyliczeniowy enum
C/C++
enum Keys {
    OK,
    Cancel,
    Info
};
Jak obsłużyć wywołanie
CreateWindow( "Blad", OK | Cancel );
?
Dziekuje za pomoc :)
P-68613
xevuel
» 2012-11-06 16:00:53
C/C++
#define num1 1
#define num2 2

void func( int args )
{
    if(( args & num1 ) == num1 )
         cout << "Przekazano wartosc num1\n";
   
    if(( args & num2 ) == num2 )
         cout << "Przekazano wartosc num2\n";
   
}

int main( int argc, char ** argv )
{
    func( num1 | num2 );
    func( num2 );
}
P-68616
akwes
» 2012-11-06 16:01:14
No a jak działa operator bitowy?

Zastanów się jak wykombinować wartości enumów żeby po operacji alternatywy bitowej np.

0000 0001  1(2)
0000 0010  2(2)
---------  |
0000 0011  3(2)

wyszedł trzeci stan :P
P-68617
kubawal
» 2012-11-06 16:24:42
Skorzystaj z wartości szesnastkowych.
Skoro:
szesnastkowobinarnie
0x00000
0x10001
0x20010
0x30011
0x40100
0x50101
0x60110
itd.

To można napisać na przykład tak:
C/C++
enum Flagi_drukarki { stan_dobry = 0x0, brak_farby_czarnej = 0x1, brak_farby_bialej = 0x2, brak_papieru = 0x4 };

//...

if( get_flags() ==( brak_farby_czarnej | brak_farby_bialej )
{
    wyswietl_blad();
}
//...
Flagi_drukarki f()
{
    _Driver * ptr = reinterpret_cast < _Driver *>( ADRES );
    Flagi_drukarki fl;
    if( 0xffb & ptr )
    {
        fl |= brak_papieru;
    }
    if( 0xf0c & ptr )
    {
        fl |= brak_farby_czarnej;
    }
    //...
}
Żadne bity wyliczenia Flagi_drukarki się nie pokrywają
P-68620
starter
Temat założony przez niniejszego użytkownika
» 2012-11-14 12:10:08
Pokombinowałem i znalazłem :)
Każda kolejna wartość enuma musi być potęgą dwójki i wtedy nic się nie pokryje :)
P-69221
« 1 »
  Strona 1 z 1