Russian Qt Forum

Программирование => С/C++ => Тема начата: photo.master от Ноябрь 16, 2009, 13:14



Название: Флаги
Отправлено: photo.master от Ноябрь 16, 2009, 13:14
Как в функции определить параметр-флаг и как определить переданный набор флагов?


Название: Re: Флаги
Отправлено: Павел_F. от Ноябрь 16, 2009, 13:22
Ну... typedef'ом меняеш беззнаковый инт на то, что хочеш. Передаеш то что хочешь воспринимая( мысленно) это не интом а набором бит ( кол-во зависит от архитектуры, но если пользовать, например, первые два то работать будет везде 100%). Определяеш нужные тебе флаги и масками читаеш/пишеш из полученного инта нужные тебе флаги.
коряво как-то получилось, но суть, думаю, уловить можно
Код:
typedef unsigned int MyFlags;// Это инт для передачи по функциям
enum FlagValue {  FLAG_1 = 0x0001,  FLAG_2  = 0x0010,  FLAG_3 = 0x0100};// Это для хранения набора флагов
//Задаем флаг( по одному)
MyFlags setFlags( MyFlags value, FlagValue FLAG)
{
  return value | FLAG;
};

//Читаем флаги( все разом)
void loadFlag( MyFlags flags)
{
  if((flags & FLAG_1) != 0)
    {
      //Значит задан FLAG_1
    }
  if((flags & FLAG_2) != 0)
    {
      //Значит задан FLAG_2
    }
  if((flags & FLAG_3) != 0)
    {
      //Значит задан FLAG_3
    }
};


Название: Re: Флаги
Отправлено: Igors от Ноябрь 16, 2009, 14:06
Здесь маленький конкретный классик очень симпатично смотрится. Например
Код:
struct CFlag {
 CFlag( unsigned int flag = 0 ) : mFlag(flag) {}

 bool Get( unsigned int flag ) const { return (mFlag & flag) == flag; }
 bool Has( unsigned int flag ) const { return (mFlag & flag) != 0; }

 void Set( unsigned int flag ) { mFlag |= flag );
 void Clr( unsigned int flag ) { mFlag &= ~flag );

 unsigned int mFlag;
};


Название: Re: Флаги
Отправлено: Павел_F. от Ноябрь 16, 2009, 14:18
Здесь маленький конкретный классик очень симпатично смотрится.
Я ж и говорю... Коряво, но суть отражает. Ну энум с флагами тож пригодиться, не наизусть же их значения помнить.


Название: Re: Флаги
Отправлено: lit-uriy от Ноябрь 16, 2009, 16:40
А чем QFlags (http://www.doc.crossplatform.ru/qt/4.5.0/qflags.html) не подходит?


Название: Re: Флаги
Отправлено: Igors от Ноябрь 16, 2009, 16:54
А чем QFlags (http://www.doc.crossplatform.ru/qt/4.5.0/qflags.html) не подходит?
А тем, что если все есть готовое - то можно и писать разучиться :)


Название: Re: Флаги
Отправлено: SASA от Ноябрь 16, 2009, 19:11
А чем QFlags (http://www.doc.crossplatform.ru/qt/4.5.0/qflags.html) не подходит?
А тем, что если все есть готовое - то можно и писать разучиться :)
А свой мок компилятор, случаем, не писали? ;D Ну так, чтоб мозг не закисалл. ;D


Название: Re: Флаги
Отправлено: Igors от Ноябрь 16, 2009, 21:11
А свой мок компилятор, случаем, не писали? ;D Ну так, чтоб мозг не закисалл. ;D
Ну не сейчас конечно, но хорошая мысль. Потому что ихний с X-Code "почти не работает" а исходники есть, может их приспособить - не изучать же километры командной строки.


Название: Re: Флаги
Отправлено: Павел_F. от Ноябрь 17, 2009, 07:44
А чем QFlags (http://www.doc.crossplatform.ru/qt/4.5.0/qflags.html) не подходит?
Если писать свое легче чем понять уже готовое то не вижу смысла вникать в готовое.


Название: Re: Флаги
Отправлено: Rcus от Ноябрь 17, 2009, 09:16
Цитировать
"Those who don't understand UNIX are condemned to reinvent it, poorly." – Henry Spencer
/*hint-hint*/


Название: Re: Флаги
Отправлено: Igors от Ноябрь 17, 2009, 14:28
Цитировать
"Those who don't understand UNIX are condemned to reinvent it, poorly." – Henry Spencer
По-моему это звучит религиозно/догматично  :)