Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX - страница 7

 
A100 #:

старший бит у TERMINAL_KEYSTATE_XXX - 31й, а у GetKeyState() - 15й - т.е. Вы сравниваете заведомо разные биты

А собственно какая разница какой по счёту старший бит?
В справке написано, если старший бит равен единице, значит клавиша нажата.
Всё. 
Яндекс мне сказал, если старший бит равен единице, значит число отрицательное)
И мне как то всё равно, заведомо эти биты разные или не заведомо, главное, что они в обоих функциях равны единице)
Возможно перевод не совсем верный и имелся ввиду не старший бит, а первый, тот которым обозначается знак числа.
Но мне особо точный перевод не нужен, смысл понятен, а в тонкости я не лезу.

Мой пример не правильный, по сути попытка подогнать решение под результат.
 
Aleksandr Slavskii #:
Но мне особо точный перевод не нужен, смысл понятен, а в тонкости я не лезу.

Мой пример не правильный, по сути попытка подогнать решение под результат.

Примерно как нейросеть действуете

При том, что в том же MSDN на который Вы сослались есть пример (в сокращенном виде):

#define SHIFTED 0x8000 
    int nVirtKey;              // virtual-key code 
                            nVirtKey = GetKeyState(VK_SHIFT); 
                            if (nVirtKey & SHIFTED) 

Как видите они там сравнивают результат GetKeyState не с -1, а с битом 0x8000

 
Denis Kirichenko #:

???

Спасибо, поправил.

template <typename T>
string ToBits( const T Value )
{
  string Str = NULL;
  
  for(uint i = sizeof(T) << 3; (bool)i--;)
    Str += (string)(int)(!!(Value & ((T)1 << i)));
    
  return(Str);
}
 
A100 #:

Примерно как нейросеть действуете

При том, что в том же MSDN на который Вы сослались есть пример (в сокращенном виде):

Как видите они там сравнивают результат GetKeyState не с -1, а с битом 0x8000

Вот нашёл разжёванный вариант объясняющий работу  GetKeyState, и не вижу принципиальной разницы между сравниванием с -1 и  0x8000.   По сути, тот же ху~ только в левой руке. 

" Для шестнадцатеричного 0x8000 только 15 бит выставлен в значение 1, если биты считать с 0.

А функция GetKeyState возвращает знаковый тип SHORT, размер которого два байта (16 бит), и для любого отрицательного числа старший бит устанавливает в значение 1.

Следовательно, после приведения выражения GetKeyState(virtual_key_code) & 0x8000 к логическому типу, для любого отрицательного virtual_key будет возвращаться true.

Старший бит сообщает о том, что клавиша нажата, младший – о её переключении (например, CapsLock включен)."

#define KEY_PRESSED  0x8000
#define KEY_SWITCHED 0x0001

if (GetKeyState(VK_SHIFT) & KEY_PRESSED) {
    // TODO:
} else {
    // TODO:
}

if (GetKeyState(VK_CAPITAL) & KEY_SWITCHED) { 
    // TODO: 
} else { 
    // TODO: 
}

 
Aleksandr Slavskii #:

Вот нашёл разжёванный вариант объясняющий работу  GetKeyState, и не вижу принципиальной разницы между сравниванием с -1 и  0x8000.   По сути, тот же ху~ только в левой руке. 

Для GetKeyState разницы нет, а для TERMINAL_KEYSTATE_XXX - есть, потому что

 
A100 #:

Для GetKeyState разницы нет, а для TERMINAL_KEYSTATE_XXX - есть, потому что

Блин :(

Вот честно пытаюсь, но не получается понять в чём разница.

Если два выражения возвращают одно и то же число, то какая разница на каком месте бит?

Print(TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL) & 0x8000);//32768
Print(GetKeyState(0x11) & 0x8000);//32768
В противном случае, если нажата другая клавиша оба эти выражения возвращают ноль
 
Вот простейший пример, когда сравнение дает разный результат:
void OnStart()
{
    int i = -2147418112;     //Результат:
    Print(     i < 0 );      //true
    Print(bool(i & 0x8000)); //false
}
 
A100 #:
Вот простейший пример, когда сравнение с -1 и 0x8000 дает разный результат:

Не корректный пример, так как мы имеем дело не абстрактным(любым) числом, а с конкретным числом которое возвращает функция.

А функция возвращает не абы какое число, а именно GetKeyState ()   -127 или -128 или 1,  TERMINAL_KEYSTATE_XXX  -32767 или 0

Для конкретно этих чисел вполне корректно работает сравнение с -1

 
Aleksandr Slavskii #:

Не корректный пример, так как мы имеем дело не абстрактным(любым) числом, а с конкретным числом которое возвращает функция.

А функция возвращает не абы какое число, а именно GetKeyState ()   -127 или -128 или 1,  TERMINAL_KEYSTATE_XXX  -32767 или 0

Для конкретно этих чисел вполне корректно работает сравнение с -1

А Вы со всеми TERMINAL_KEYSTATE_XXX это проверили - там их порядка 20ти разных ?

Если не со всеми - то это у Вас некорректный пример, а не у меня

 
A100 #:

А Вы со всеми TERMINAL_KEYSTATE_XXX это проверили - там их порядка 20ти разных ?

Нет, только с TERMINAL_KEYSTATE_CONTROL.

A100 #:

Если не со всеми - то это у Вас некорректный пример, а не у меня

Возможно.
Причина обращения: