Функция C ++ принимает целые числа, но пример показывает текст?

0

Это вопрос C++ о том, что меня смущает. (Я обновляю свой C++ после долгого времени). Я читаю этот пример здесь. Меня смущают две части:

Первая часть:

В строке кода:

void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )

WINDOW_AUTOSIZE - это вход, но насколько я могу судить, это не int. Когда я кодирую эту строку и запускаю, она работает нормально. Мой ввод в эту функцию буквально "WINDOW_AUTOSIZE". Я смущен, почему это работает. Как WINDOW_AUTOSIZE int?

Мой второй вопрос касается последней строки, в которой говорится:

По умолчанию флаги == CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED

Я смущен тем, как/что это значит... Я знаю, что | побитовое ИЛИ, но не ясно, что именно это означает...

Спасибо.

  • 0
    что вы думаете WINDOW_AUTOSIZE был? Строки ограничены кавычками.
  • 0
    @MattMcNabb Я не был уверен, так как я не определил это. Но он существует в заголовочном файле.
Теги:
function
bit-manipulation
int

3 ответа

4
Лучший ответ

Мой ввод в эту функцию буквально "WINDOW_AUTOSIZE"

Да, WINDOW_AUTOSIZE на самом деле является целым числом; Просто посмотрите на то, что это аргумент по умолчанию для параметра функции int. Он не будет компилироваться, если бы он не был int

// it might have been defined like this
#define WINDOW_AUTOSIZE 23434 // some number just for example
// or like this
const int WINDOW_AUTOSIZE = 34234;

Что касается второго вопроса поразрядного OR означает, что все биты в соответствующих интегральных значениях OR совместно, так что скажем, например,

CV_WINDOW_AUTOSIZE   = 0x0010 
CV_WINDOW_KEEPRATIO  = 0x0100
CV_GUI_EXPANDED      = 0x1100

то соответствующая операция даст целое значение с каждым битом, равным результату OR для каждой позиции

CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED = 

0x0010 
0x0100
0x1100
------
0x1110

Об использовании битовых флагов

Рассмотрим следующее: у вас есть клавиатура с 4 ключами:

Ctrl, Alt, Del, Shift

Сколько констант вам понадобилось бы для определения всех состояний, на которые может работать эта клавиатура? Ну позволяет перечислять состояния

  1. Все 4 клавиши нажаты: 1 постоянная

  2. 3 нажатых клавиши: требуется (4 на 3) константы = 4 константы:

    (4 by 3) = 4! / ( (4-3)! * 3! ) = 4 
    
  3. 2 нажатых клавиши: (4 на 2) = 6 констант

  4. 1 нажата клавиша: 4 константы (имена клавиш)

  5. Без нажатия клавиши: 1 постоянная

Итак, подведем итог:

1 + 4 + 6 + 4 + 1 = 16 constants

Теперь, если бы я сказал вам, что вам нужны только 4 разных константы, каждый из которых имеет только один бит ON? :

#define CtrlK  0x0001
#define AltK   0x0010
#define DelK   0x0100
#define ShiftK 0x1000

Тогда любое состояние для клавиатуры может быть выражено комбинацией из вышеперечисленного: скажем, вы хотите выразить клавишу Shift состояния и клавишу Del. Тогда это будет

CtrlK | DelK

Чем больше комбинаций у вас есть, тем больше этот метод окупается.

Беспокойство (возможно, вы можете увидеть ссылку на битфлаги), код пользователя может исследовать интегральное значение, чтобы увидеть, какие биты включены.

  • 0
    Спасибо, это имеет большой смысл. Полагаю, последнее, что я не понимаю, - это почему они установили флаг по умолчанию, чтобы он был побитовым ИЛИ трех вещей, которые уже определены ... не видя цели здесь.
  • 0
    В этом контексте оборудование @Learnaholic Bitflag используется для предотвращения комбинаторного взрыва. Таким образом, у вас есть, например, ваши начальные состояния , выраженные в виде битовых флагов, и любой статус может быть выражен как комбинация этих (взаимно исключаемых) состояний. Это все равно, что сказать: «Конфигурация клавиатуры по умолчанию будет NUM_LOCK = ON и ( & ) CAPS_LOCK = ON», поэтому INITIAL_STATE = NUM_LOCK & CAPS_LOCK . Это спасает вас от определения другого государства
Показать ещё 7 комментариев
5

Слова, написанные заглавными буквами, являются константами. Они были определены где-то в коде или в заголовках, которые будут использоваться в другом месте. Константа может стоять за число, строку и т.д. Константы в этом коде, очевидно, имеют тип int

CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED - это просто поразрядное ИЛИ значений int на которые CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED константы. Это пространственные константы, где задан только один бит int (так называемые флаги)

Предположим, CV_WINDOW_AUTOSIZE равен 0x1, а CV_WINDOW_KEEPRATIO - 0x2. Таким образом, побитовое ИЛИ-ing приведет к 0x3. Вызываемая функция может затем проверить операцию AND, для которой был установлен флаг.

  • 0
    Ах, спасибо! То есть вы имеете в виду, например, что они определены как "#define CV_WINDOW_AUTOSIZE 1"?
  • 1
    Да, обычно вы используете шестнадцатеричные числа, это проще. (0x8 это 1000 двоичных файлов, например)
Показать ещё 16 комментариев
1

Я верю, что WINDOW_AUTOSIZE не является строкой или текстом. Это будет постоянная константа или постоянная константа #defined. Таким образом, int datatype может принять его. Пожалуйста, проверьте определение WINDOW_AUTOSIZE в исходном коде. Также обратите внимание, что мы можем передавать переменные с типами 'char', 'enum' в функцию, которая принимает int. Преобразование в int будет происходить внутри.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню