Russian Qt Forum
Ноябрь 23, 2024, 11:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Флаги  (Прочитано 6124 раз)
photo.master
Гость
« : Ноябрь 16, 2009, 13:14 »

Как в функции определить параметр-флаг и как определить переданный набор флагов?
Записан
Павел_F.
Гость
« Ответ #1 : Ноябрь 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
    }
};
« Последнее редактирование: Ноябрь 16, 2009, 13:47 от Павел_F. » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 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;
};
Записан
Павел_F.
Гость
« Ответ #3 : Ноябрь 16, 2009, 14:18 »

Здесь маленький конкретный классик очень симпатично смотрится.
Я ж и говорю... Коряво, но суть отражает. Ну энум с флагами тож пригодиться, не наизусть же их значения помнить.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Ноябрь 16, 2009, 16:40 »

А чем QFlags не подходит?
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Ноябрь 16, 2009, 16:54 »

А чем QFlags не подходит?
А тем, что если все есть готовое - то можно и писать разучиться Улыбающийся
Записан
SASA
Гость
« Ответ #6 : Ноябрь 16, 2009, 19:11 »

А чем QFlags не подходит?
А тем, что если все есть готовое - то можно и писать разучиться Улыбающийся
А свой мок компилятор, случаем, не писали? Смеющийся Ну так, чтоб мозг не закисалл. Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 16, 2009, 21:11 »

А свой мок компилятор, случаем, не писали? Смеющийся Ну так, чтоб мозг не закисалл. Смеющийся
Ну не сейчас конечно, но хорошая мысль. Потому что ихний с X-Code "почти не работает" а исходники есть, может их приспособить - не изучать же километры командной строки.
Записан
Павел_F.
Гость
« Ответ #8 : Ноябрь 17, 2009, 07:44 »

А чем QFlags не подходит?
Если писать свое легче чем понять уже готовое то не вижу смысла вникать в готовое.
Записан
Rcus
Гость
« Ответ #9 : Ноябрь 17, 2009, 09:16 »

Цитировать
"Those who don't understand UNIX are condemned to reinvent it, poorly." – Henry Spencer
/*hint-hint*/
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Ноябрь 17, 2009, 14:28 »

Цитировать
"Those who don't understand UNIX are condemned to reinvent it, poorly." – Henry Spencer
По-моему это звучит религиозно/догматично  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.158 секунд. Запросов: 23.