1

Тема: AHK: Ошибка в цикле.

Код:

Gui, Add, ListBox, x2 y0 w220 h360 vDm, 
Gui, Add, Button, x62 y360 w100 h30 gSave, Запуск
Gui, Show, w226 h394, 
return
a:=1
s:=0
Save:
GuiControl,,Dm, Числа:
Vt:
If (%s%==1)
	goro Yt
else
	goro Nt
Nt:
a:=a+11
GuiControl,,Dm, %a%
goto Ft
Ft:
If (%a%/2009)
	goto Pt
else 
	goto Nt
Pt:
s:=s+1
goto Vt
Yt:
k:=a
GuiControl,, Dm, %k%
return
GuiClose:
ExitApp

Выдает ошибку при дохождении до goto. Не могу понять в чем ошибка.

2 (изменено: aktor311, 2017-10-05 16:31:25)

Re: AHK: Ошибка в цикле.

Уже понял свою ошибку.
Вместо goto написал goro)
Но скрипт все равно не работает.
Вот сама задача:
Компьютер в первую секунду печатает на экране 1, во вторую – число 12, в третью – число 23. То есть, в каждую следующую секунду – на 11 больше, чем в предыдущую. В какую секунду впервые появится число, делящееся на 2009?
Вот уже исправленный мною код:

Gui, Add, ListBox, x2 y0 w220 h360 vDm, 
Gui, Add, Button, x62 y360 w100 h30 gSave, Запуск
Gui, Show, w226 h394, 
return
a:=1
s:=0
k:=1
IsLabel (Vt)
IsLabel (Yt)
IsLabel (Nt)
IsLabel (Ft)
IsLabel (Pt)
Save:
GuiControl,,Dm, Числа:
Vt:
If (s==1)
	goto Yt
else
	goto Nt
Nt:
a:=a+11
k:=k+1
GuiControl,,Dm, %a%
goto Ft
Ft:
If (a//2009)
	goto Pt
else 
	goto Nt
Pt:
s:=s+1
goto Vt
Yt:
GuiControl,, Dm, %k%
return
GuiClose:
ExitApp

3 (изменено: Alectric, 2017-10-05 18:03:42)

Re: AHK: Ошибка в цикле.

Ты сам то свой код можешь прочитать?

Хоть бы пустыми строками блоки отделял...
После ретурна код не выполняется:

return
a:=1
s:=0
k:=1
+ открыть спойлер
a:=1
s:=0
k:=1

Gui, Add, ListBox, x2 y0 w220 h360 vDm,
Gui, Add, Button, x62 y360 w100 h30 gSave, Запуск
Gui, Show, w226 h394,
return

Save:
GuiControl,,Dm, Числа:

Vt:
If (s==1)
  goto Yt
else
  goto Nt

Nt:
a:=a+11
k:=k+1
GuiControl,,Dm, %a%
goto Ft

Ft:
If (a//2009)
  goto Pt
else
  goto Nt

Pt:
s:=s+1
goto Vt

Yt:
GuiControl,, Dm, %k%
return

GuiClose:
ExitApp

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

4 (изменено: Alectric, 2017-10-05 18:15:35)

Re: AHK: Ошибка в цикле.

Перевёл на нормальный язык:

a:=1
s:=0
k:=1

Gui, Add, ListBox, x2 y0 w220 h360 vDm,
Gui, Add, Button, x62 y360 w100 h30 gSave, Запуск
Gui, Show, w226 h394,
return

Save:
GuiControl,,Dm, Числа:
loop
{
  a+=11
  k++
  GuiControl,,Dm, %a%
  If (a//2009)
  {
    GuiControl,, Dm,K = %k%
    break
  }
}
return

GuiClose:
ExitApp

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

5 (изменено: aktor311, 2017-10-05 18:29:07)

Re: AHK: Ошибка в цикле.

Alectric, спасибо большое.
И объявление label в данном случае не необходимо?

6 (изменено: aktor311, 2017-10-05 19:12:06)

Re: AHK: Ошибка в цикле.

Не подскажите, с помощью какой функции можно отсекать последнюю цифру записанного числа после проверки, с помощью Mod?
Вот пример кода:

k:=0
Gui, Font, S10 CDefault, Verdana
Gui, Add, ListBox, x2 y0 w290 h470 vDm, 
Gui, Add, Button, x85 y470 w120 h30 gSave, Запуск
Gui, Show, w295 h509, 
return 

Save:
GuiControl,, Dm, Введите число:
GuiControl,,Dm, (для завершения нажмите Enter)
Input, Число, V, {sc1C}
a:=Число
while (a!=0)
GuiControl,, Dm, %a%
s:=Mod(a,2)
GuiControl,,Dm,	%s%
If (s==0)
	k:=k+1
GuiControl,,Dm, %k%

return
GuiClose:
ExitApp

Допустим написано число 1468
Я проверяю четная ли последняя цифра, если четна то k:=k+1, и отсекаю ее.
Таким образом проверяю следующую.
Пока все цифры не будут отсечены и a==0.

7

Re: AHK: Ошибка в цикле.

Вот моя попытка:

k=0
q=10

Gui, Font, S10 CDefault, Verdana
Gui, Add, ListBox, x2 y0 w290 h470 vDm, 
Gui, Add, Button, x85 y470 w120 h30 gSave, Запуск
Gui, Show, w295 h509, 
return 

Save:
GuiControl,, Dm, Введите число:
GuiControl,,Dm, (для завершения нажмите Enter)
Input, Число, V, {sc1C}
a:=Число
GuiControl,, Dm, %a%

St:
if (a<=0)
	goto Yt
else
	goto Nt

Nt:
s:=Mod(a,2)
c:=Mod(a,q)
If (s==0)
	k:=k+1
q:=q*10
a:=a-c
a:=a*0.1
goto St

Yt:
GuiControl,,Dm, %k%

return
GuiClose:
ExitApp

Вроде работает, но иногда дает, так сказать, "сбои".
Например при вводе 888 считает только 2.
Где я допустил ошибку?

8 (изменено: MandarinKa02, 2017-10-05 22:20:54)

Re: AHK: Ошибка в цикле.

Вопрос: зачем goto? Который раз смотрю эти "примеры", везде goto лепят. На#*?

Почему нельзя сделать строчкой Loop {} и поставить в цикл? for для кого?

Делаю скрипты на заказ.
По вопросам сюдой: Skype: live:ddeeeennn

9

Re: AHK: Ошибка в цикле.

Нормальных слов подобрать запаса не хватает? Если хотите что-нибудь посоветовать то вперёд, но ведите себя достойно. Не все мы великие программисты.

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

10 (изменено: aktor311, 2017-10-06 04:59:07)

Re: AHK: Ошибка в цикле.

MandarinKa02, мягко говоря, я использую goto, потому что не до конца понимаю суть работы looр. А ошибаться в каждом loop не очень хочется.
И раз так получилось, не соизволите ли объяснить мне суть работы loop на каком-нибудь простеньком примере.
Не то что бы я был глупым, я просто только начинающий, да и никто мне ничего не объяснял. А, я бы сказал, в русскоязычной справке изложено далеко не все.

11

Re: AHK: Ошибка в цикле.

loop
{
   ; continue   ; если раскоментировать, то msgbox не появится, так как цикл будет переходить на начало.
   msgbox % A_Index
   if A_Index = 3   ; если пошла 3 итерация
      break   ; выходим из цикла.
}
msgbox прошло 3 итерации цикла.

12

Re: AHK: Ошибка в цикле.

aktor311 пишет:

не соизволите ли объяснить мне суть работы loop на каком-нибудь простеньком примере.

Вот несколько простеньких примеров.

Пример бесконечного цикла.
С Goto:

i := 0
Label:
   i++   ; увеличиваем i на единицу
   ToolTip % i
   Sleep, 300
   goto Label

То же самое с Loop:

Loop  {
   ToolTip % A_Index
   Sleep, 300
}

Здесь роль переменной-счётчика i играет встроенная переменная A_Index, которая автоматически увеличивается с каждой итерацией на единицу. Принципиальное отличие в том, что A_Index имеет смысл и доступна только внутри своего цикла, а переменную i можно изменить извне, что может привести к ошибке, если мы случайно используем эту же переменную где-то в другом месте.

Пример выхода из цикла по условию.
С Goto:

i := 0
Label1:
   i++
   ToolTip % i
   Sleep, 300
   if (i = 10)
      goto Label2
   goto Label1

Label2:
   ToolTip
   MsgBox, Завершено!
   return

To же самое с Loop:

Loop  {
   ToolTip % A_Index
   Sleep, 300
   if (A_Index = 10)
      break
}

MsgBox, Завершено!
return

Или проще:

Loop 10  {
   ToolTip % A_Index
   Sleep, 300
}

ToolTip
MsgBox, Завершено!
return

Ещё аналогичный пример с until:

Loop  {
   ToolTip % A_Index
   Sleep, 300
} until A_Index = 10

ToolTip
MsgBox, Завершено!
return

А следующий пример будет работать по-другому:

while A_Index < 10  {
   ToolTip % A_Index
   Sleep, 300
}

ToolTip
MsgBox, Завершено!
return

Здесь проверка условия идёт в начале цикла, если условие не выполняется, следующая итерация отменяется и цикл прерывается.

Применение цикла для посыла клавиш:

Space::
   while GetKeyState("Space", "P")  {
      SendInput, f
      Sleep, 300
   }
   return

Пока удерживается пробел, будет выполняться условие GetKeyState("Space", "P") и будет посылаться f. Как только пробел будет отпущен, условие перестанет выполняться, и цикл завершится.

Надеюсь, что-то прояснилось.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

13

Re: AHK: Ошибка в цикле.

teadrinker, Спасибо большое

14 (изменено: Malcev, 2017-10-09 03:28:45)

Re: AHK: Ошибка в цикле.

teadrinker, думаю разумно будет продублировать тебе своё сообщение в "Автохотки для чайников".
ypppu, предлагаю тему "Автохотки для чайников" продублировать в раздел Autohotkey и в Autohotkey Games, а то в разделе скриптов и идей, думаю, ее никто не читает.

15

Re: AHK: Ошибка в цикле.

Такая ссылка уже имеется в закреплённых в разделах темах.

16

Re: AHK: Ошибка в цикле.

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

17

Re: AHK: Ошибка в цикле.

А где ещё более видное место?
Разве что переименовать в "Обязательно прочитайте перед созданием темы!". Так можно привлечь внимание.

18 (изменено: Malcev, 2017-10-09 18:32:58)

Re: AHK: Ошибка в цикле.

Я бы создал новую тему с пометкой важно в подфорумах AutoHotkey и AutoHotKey — Games и назвал бы FAQ - Ответы на часто задаваемые вопросы по автохотки.
А в ней либо продублировал бы тему, которая находится сейчас в Коллекции скриптов и идей, либо если это невозможно, на уровне движка, чтобы автоматом дублировалось, то просто дал бы ссылку на топик в Коллекцию скриптов и идей.
Тогда на однотипные вопросы можно смело будет посылать читать FAQ.
А то сейчас пользователю, который зарегестрировался, чтобы задать вопрос по игровой тематике, для того, чтобы найти FAQ нужно зайти в тему - "Информация к данному разделу", потом нажать спойлер "документация", и потом из списка выбрать "AutoHotkey для чайников".
И лично мне это название не говорит, что там будет FAQ.

19

Re: AHK: Ошибка в цикле.

Темы уже созданы и имеют отметку важности, и в них имеются ссылки на AutoHotkey для чайников. Другое дело, что слово "информация" не так привлекает внимание, как "обязательно прочитать". Ну а из-под спойлера можно убрать, всё-таки это не документация. Пойдёт?

20 (изменено: Malcev, 2017-10-09 20:36:29)

Re: AHK: Ошибка в цикле.

FAQ и AutoHotkey для чайников имхо не синонимы.
FAQ - это  Ответы на часто задаваемые вопросы.
В Информацию по разделу AutoHotkey заходят не все, о чем свидетельствует ряд однотипных вопросов и несоблюдение правил.
"Обязательно прочитать", также могут игнорировать.
На многих профильных форумах присутствуют в подразделах факи, почему бы и нам такой не сделать?

21

Re: AHK: Ошибка в цикле.

Вообще в теме "Информация по разделу..." я предполагал выложить все наиболее важные и часто посещаемые ссылки. Но чтобы только прикреплённая тема была одна, а уже в ней поместить ссылку на FAQ.

"Обязательно прочитать", также могут игнорировать.

А если будет закреплено несколько тем с отметкой важности , тем более скажут "многобукоф". Поэтому предлагаю создать темы "FAQ: Часто задаваемые вопросы по AutoHotkey" и "FAQ: Часто задаваемые вопросы по AutoHotkey - Games" в соответствующих разделах. А в закреплённых темах уже ссылаться на них.

22

Re: AHK: Ошибка в цикле.

Может тогда заменить "Информация по разделу AutoHotkey" на "Информация и FAQ по разделу AutoHotkey"?

23

Re: AHK: Ошибка в цикле.

Можно. Создавай темы в разделах, я сделаю на них ссылки в прикреплённых темах и переименую. Самому, честно говоря, сейчас не хватает времени на наполнение FAQ-тем.

24 (изменено: Malcev, 2017-10-09 21:49:36)

Re: AHK: Ошибка в цикле.

ypppu, я имел в виду не создавать новые темы, а раскрутить уже имеющуюся.
Для этого достаточно будет переименовать эту тему:
http://forum.script-coding.com/viewtopic.php?id=12263
на "Информация и FAQ по разделу AutoHotkey".
А эту:
http://forum.script-coding.com/viewtopic.php?id=12557
на "Информация и FAQ по разделу AutoHotkey - Games".
А в этих темах первым пунктом написать:
"FAQ: Часто задаваемые вопросы по AutoHotkey" с ссылкой на:
http://forum.script-coding.com/viewtopic.php?id=7439

25

Re: AHK: Ошибка в цикле.

Сделано. Хотя, по-моему, информация для чайников и часто задаваемые вопросы - это разные вещи.