1 (изменено: Indomito, 2012-03-30 00:27:55)

Тема: AHK: Описание функции/global/if then else - я немного запутался...

Извиняюсь за столь сложное название темы, но вопрос один.

Вот три фрагмента одной программы.

1. Описание переменных

;=============Секция эмуляции кнопок============
; Модификаторы - две штуки
btJoy7 := 7
btShiftA := btJoy7
; и т.д. все описание приводить не стал - очень много

2. Функция проверки, все переменные global определены в основном коде.

fnShiftABMouse(NumKeyJoy)
{
global btShiftA, fShiftA, ShiftA
global btShiftB, fShiftB, ShiftB
global ButtonLeft
global ButtonRight
fShiftA := GetKeyState(ShiftA)
fShiftB := GetKeyState(ShiftB)
if (NumKeyJoy = btShiftA) 
 return 1 ; Истина - клавиша смещения A
if (NumKeyJoy = btShiftB)
 return 2 ; Истина - клавиша смещения B
if (NumKeyJoy = ButtonLeft)
 return 3 ; Истина - клавиша мышки ЛКМ
if (NumKeyJoy = ButtonRight)
 return 4 ; Истина - клавиша мышки ПКМ
return 0 ; Ложь - клавишу можно обрабатывать
}

3. Обработка одной кнопки.

lbJoy1:
if fnShiftABMouse(btJoy1)
  return
if (fShiftA) 
 send {%btJoy1KeyA%}
 else if (fShiftB)
  send {%btJoy1KeyB%}
    else 
    send {%btJoy1Key%}
return

По №1 вопросов нет
По №2 правильно ли я описал переменные глобальные, а также сам IF
По №3 тот же вопрос.

Меня интересует семантика AHK... поясню
if проверка - заключать в скобки обязательно или нет?
then {действие} - обязательно на другой строке?
else|else if - тот же вопрос.

Просто я не могу точно понять как верно описать if then else что бы AHK меня понял.

P.S. Просто проверять каждое условие на верность с помощью отл. точек сложновато.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

2 (изменено: creature.ws, 2012-03-30 00:50:50)

Re: AHK: Описание функции/global/if then else - я немного запутался...

Чтобы AHK вас понял пишите if…else согласно инструкциям в документации к этим командам.
Вариант ниже будет работать.

If (expression) {
    command
}
Else {
    command
}

3 (изменено: Indomito, 2012-03-30 02:29:54)

Re: AHK: Описание функции/global/if then else - я немного запутался...

Я согласен с

If (expression) {
    command
}

но думаю можно не писать

Else {
    command
}

если в этом нет необходимости или же гарантий нет, на правильность компиляции?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: AHK: Описание функции/global/if then else - я немного запутался...

Какой-такой «компиляции»?
OFF: мне почему-то начинает казаться, что в этой теме (как и предыдущей) нечего обсуждать.

5

Re: AHK: Описание функции/global/if then else - я немного запутался...

Если Else не нужен, не пишите. Если используется много глобальных переменных, можно поставить в начало функции слово Global и все переменные будут по умолчанию глобальными, т.е. объявлять их будет не надо, просто используйте. В справке это всё есть.

Просто я не могу точно понять как верно описать if then else что бы AHK меня понял.

Если код работает, как ожидалось, значит правильно написали. И в справке всё есть — и про скобки тоже.

6 (изменено: Indomito, 2012-03-30 19:38:45)

Re: AHK: Описание функции/global/if then else - я немного запутался...

creature.ws и YMP
1. Компиляция производится при старте скрипта, например в BASIC это псевдокод. Компиляция проводится при проверки синтаксиса и разборе выражений, т.е. то что происходит до старта кода/скрипта это компиляция.
Например файл *.bat не компилируемый, т.е. все ошибки выявляются на этапе его выполнения.
2. Согласен в справке почти всё есть.
3. В справке отсутствует формальное описание объявления функции и объявления if then else - просто один пробел не там и всё работает не так. Я не нашёл пока формального описания, может и оно есть, но я его не увидел ни разу.
Пример формального описания это если в консоли написать help format и он выдаст формальное описание команды формат и примеры.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

7

Re: AHK: Описание функции/global/if then else - я немного запутался...

Indomito
Не совсем понимаю, что вы имеете в виду под формальным описанием. Пример привести можете? Любопытно взглянуть.
Как бы то ни было, насчёт пробела там сказано предельно ясно:

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

8 (изменено: Indomito, 2012-03-30 19:46:06)

Re: AHK: Описание функции/global/if then else - я немного запутался...

YMP вот пример формального описания Функции языка Си

Основная форма описания (definition) функции имеет вид:

тип <имя функции>(список параметров)
{
        тело функции
}

Вызов функции делается следующим образом:

<имя функции>(параметры);

или

<переменная>=<имя функции>(параметры);

При вызове функции так же ставиться точка с запятой.

не идеальное описание, но это первое что я нашёл по поиску.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

9

Re: AHK: Описание функции/global/if then else - я немного запутался...

И ещё.
Из-за чувствительности AHK к пробелам и новой строке:

if (условие) return
и
if (условие)
return

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

10

Re: AHK: Описание функции/global/if then else - я немного запутался...

В голову не пришло, потому как справку не читали Там в явном виде сказано о неприемлемости command-name style к If

Группировка выражений                   (...)
Блок                                    {...}
Равенство                               =
Равенство с учетом регистра символов    ==
Неравенство                             != <>
Сравнение                               < > >= <=
Определение функции                     f(p1, p2)
                                        {
                                            ...
                                        }
Вызов функции                           f(a, b, ...)
Вызов функции без параметров            f()
Последовательность                      , или конец строки
Если - то                               if condition
                                            ...
Если - то - иначе                       If condition
                                            ...
                                        Else
                                            ....

11

Re: AHK: Описание функции/global/if then else - я немного запутался...

Однострочное действие нет нужды заключать в блок, многострочное — необходимо.
Эта и предыдущая ваши темы «высосаны из пальца».

12

Re: AHK: Описание функции/global/if then else - я немного запутался...

Так, у меня есть chm-файл там такого я не нашёл - честно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

13

Re: AHK: Описание функции/global/if then else - я немного запутался...

Такого как в сообщении #10? это самодельная адаптация
О If рассказывается в разделе о If.

14 (изменено: Indomito, 2012-03-30 20:13:16)

Re: AHK: Описание функции/global/if then else - я немного запутался...

creature.ws тогда следует писать
ТАК

lbJoy1:
if (fnShiftABMouse(btJoy1))
  return
if (fShiftA) 
 send {%btJoy1KeyA%}
else {
 if (fShiftB)
  send {%btJoy1KeyB%}
 else 
  send {%btJoy1Key%}
  }
return

А не так

lbJoy1:
if (fnShiftABMouse(btJoy1))
  return
if (fShiftA) 
 send {%btJoy1KeyA%}
 else if (fShiftB)
  send {%btJoy1KeyB%}
    else 
    send {%btJoy1Key%}
return

Верно?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

15

Re: AHK: Описание функции/global/if then else - я немного запутался...

Indomito
А что, else if (fShiftB) у вас не работает? Я всё-таки упорно не пойму, к чему такие вопросы, если проверить минутное дело.
Что касается формальности, то АНК предназначен не для программистов, поэтому отсутствие оной, вероятно, сознательное решение автора.

16 (изменено: creature.ws, 2012-03-30 20:21:32)

Re: AHK: Описание функции/global/if then else - я немного запутался...

Форматирование стандартным числом пробелов творит чудеса


lbJoy1:
    if fnShiftABMouse(btJoy1)
        return
    if (fShiftA)
        send {%btJoy1KeyA%}
    else
    {
        if (fShiftB)
            send {%btJoy1KeyB%}
        else
            send {%btJoy1Key%}
    }
    return

lbJoy1:
    if fnShiftABMouse(btJoy1)
        return
    if (fShiftA)
        send {%btJoy1KeyA%}
    else if (fShiftB)
        send {%btJoy1KeyB%}
    else
        send {%btJoy1Key%}
    return

«Правильно» в данном случае — так, как вам «приятнее видеть». Действия то одинаковые будут выполняться.
Мне — приятнее видеть else if

Такие вопросы, вероятно, для «поговорить за жизнь».

17 (изменено: Indomito, 2012-03-30 20:30:07)

Re: AHK: Описание функции/global/if then else - я немного запутался...

YMP да работает, но после "проколов" в других конструкциях я уже побаиваюсь А насчёт "формальности" я почти согласен, но лучше иметь строгое описание для тех кто привык к оному
creature.ws ну мне приятнее видеть более короткую запись не разбитую на кучу строк и плюс - я лучше перестрахуюсь, просто проверять что верно работает - утомительно

Спасибо за ваши ответы и за "соучастие"

P.S.

creature.ws пишет:

Такие вопросы, вероятно, для «поговорить за жизнь».

ну почти, хотя не только - узнаю много "нового"

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

18

Re: AHK: Описание функции/global/if then else - я немного запутался...

Т.е. полуминутный тест — утомительно, а тема на форуме с 7-ю коментариями — нет. Ага…

19 (изменено: Indomito, 2012-03-30 20:40:49)

Re: AHK: Описание функции/global/if then else - я немного запутался...

creature.ws пишет:

Т.е. полуминутный тест — утомительно, а тема на форуме с 7-ю коментариями — нет. Ага…

Поясняю...
Когда я наткнулся на ошибку с if then else то имел достаточно большой код и точек пришлось ставить кучу... большую кучу, что бы понять где я ошибся, а с многочисленными условными конструкциями метод половинного деления не прокатывает

И ещё, некоторые  условия работают по таймеру, а когда я выяснил что проблема не в том что я ошибся, а в том что синтаксически не верно записал if then else.

Так что... спросить на форуме всё же проще.

IMHO

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

20

Re: AHK: Описание функции/global/if then else - я немного запутался...

Indomito пишет:

YMP да работает, но после "проколов" в других конструкциях я уже побаиваюсь

А чего побаиваетесь? Что при запуске тестового кода взорвётся комп?
Если человек, не изучив толком синтаксис языка, пишет сложный код и там что-то не работает — ну извините, это в любом языке так будет.

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

21

Re: AHK: Описание функции/global/if then else - я немного запутался...

Да, был не прав, почитал англ. справку и всё оказалось намного проще + нашёл конструкции которых нет в русской... видимо она немного устарела.
Всем спасибо.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download