Определение переменной в функции через if else

Пожалуйста, смотрите маленький код ниже:

void TestPluginAPI::MouseMove(int nX, int nY)
{
INPUT input;
DOUBLE fScreenWidth = GetSystemMetrics( SM_CXSCREEN )-1;
DOUBLE fScreenHeight  = GetSystemMetrics( SM_CYSCREEN )-1;
int plusY;
if (FullScreenCheck() == 1) {int plusY = getmidY() + 8.0f;}
else {int plusY = getmidY();}
int plusX = getmidX();
DOUBLE fX = plusX*(65535.0f/fScreenWidth) + (nX*(65535.0f/fScreenWidth));
DOUBLE fY = plusY*(65535.0f/fScreenHeight) + (nY*(65535.0f/fScreenHeight));

RtlZeroMemory(&input, sizeof(input));
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;
input.mi.dx = (LONG)fX;
input.mi.dy = (LONG)fY;

SendInput(1, &input, sizeof(input));
}

Дело в том, что компилятор дает мне предупреждение, что plusY не определено, и, очевидно, если я пытаюсь запустить эту функцию в скомпилированном плагине (это происходит из кода плагина, отлаживая его через консоль javascript в браузере), то происходит сбой, потому что plusY не определено

Кажется, что если я не могу определить переменные в функции через if-else, то как я могу это сделать?

0

Решение

{int plusY = getmidY() + 8.0f;}

int plusY перестает существовать на } в обоих, если заявления

int plusY внутренние скобки {} это другая переменная, чем int plusY вне.

Вы должны сделать это

int plusY;
if (FullScreenCheck() == 1) {plusY = getmidY() + 8.0f;}
else {plusY = getmidY();}
4

Другие решения

Переменные, определенные в одной из ветвей if иметь
сфера только этой ветви. Даже если вы устранили брекеты
(что было бы законно здесь):

if ( fullScreenCheck() == 1 )
int plusY = getmidY() + 8.0f;
else
int plusY = getmidY();

приведет к plusY чья сфера заканчивается после if,

Лучший способ справиться с этим:

int plusY = fullScreenCheck() == 1
? getmidY() + 8.0f
: getmidY();

Из-за ограничений на то, что вы можете сделать в одном
выражение, это не всегда возможно сделать, но всякий раз, когда вы
может, это приводит к гораздо более читабельному коду.

2

plusY удаляется из памяти по закрывающей скобке оператора if. Если вам нужно использовать его после оператора if, вы должны объявить его вне блок:

int plusY;

if (...)
{
plusY = getmidY() + 8.0f;
}
1

Весь ваш if/else может быть заменено (с фиксированными правилами области видимости) этой строкой.

int plusY = (FullScreenCheck() == 1) ? getmidY() + 8.0f : getmidY();
1
int plusY;

Вы объявили переменную с именем plusY который доступен для всей вашей функции

if (FullScreenCheck() == 1) {int plusY = getmidY() + 8.0f;}

Это заявляет другой переменная, которая также называется plusY, но эта новая переменная доступна только внутри if заявление.

else {int plusY = getmidY();}

И теперь вы объявляете в третьих переменная с тем же именем, которая доступна только в else пункт.

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

int plusY;
if (FullScreenCheck() == 1) {plusY = getmidY() + 8.0f;}
else {plusY = getmidY();}

постскриптум Кроме того, вы должны узнать о типичных практиках и соглашениях форматирования кода.

p.p.s. Вы также должны инициализировать plusY на значение, которое в противном случае является недействительным, так что вы можете легко отследить любые проблемы. Кроме того, вы можете использовать троичный оператор, чтобы полностью избежать этой проблемы. В этой ситуации троичный оператор, скорее всего, является лучшим решением.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector