Author Topic: Некорректная совместная работа if_picture_in и goto  (Read 5961 times)

0 Members and 1 Guest are viewing this topic.

Shen_De_Lar

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
смысле примерно следующий: 
sub(...)
      while(...)
      ...
            if_picture_in(...)
                  goto(skip)
            end_if
     end_cyc         
     skip:
end_sub

Когда доходило до end_sub, то прыгало назад в цикл. Удивился, когда получил цикл, хотя картинку исправно находило=)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Весь скрипт предъяви. возможна ошибка. if_picture_in тут вообще не причем.

Shen_De_Lar

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Code: (clickermann) [Select]
#name "Browser"

sub(Config, $conf_hwnd, $conf_x, $conf_y, $conf_wide, $conf_height)
   wndpos($conf_hwnd, $conf_x, $conf_y)
   wndsize($conf_hwnd, $conf_wide, $conf_height)
end_sub

sub(WaitOpen)
   while(wndfind("Increase") = 0)
      waitms(200)
   end_cyc
   $page_increase=wndfind("Increase")
   Config($page_increase, 0, 0, 1000+$yourshiftx, 650+$yourshifty)
   logwrite("открылось")
   $wait_download = 60000
   $time = $_ms + $wait_download
   while($time > $_ms)
      hset($page_increase, 1)
      getscreen
      colormode(7,500, 500, 1500,1000)
      if_picture_in(700,700, 1500,1500, "Крестик.bmp", 255, 80)
         logwrite("lol")
         $download_success=1
         goto(skip)
      end_if
      hset($page_increase, 0)
      wait(1)
   end_cyc
   $download_success=0
   skip:         
   logwrite("успех", $download_success)
end_sub

sub(WaitClose)
   while(wndfind("Increase") ! 0)
      waitms(200)
   end_cyc
   logwrite("закрылось")
end_sub

sub(Open, $Open_browser, $Open_site)
   execute($Open_browser, $Open_site)
   WaitOpen()
end_sub

sub(Close, $Close_browser)
   execute("TASKKILL",strconcat("/IM ", $browser))
   WaitClose()
end_sub

$browser="Chrome.exe"
$site="http://vk.com/increase.online?mid=21650629"
$yourshiftx=300
$yourshifty=300
Open($browser, $site)
halt // for single run

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

А причина похоже в том, что из if сваливать не хорошо, рано или поздно вернется на end_if
« Last Edit: May 11, 2014, 05:49:58 PM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
А причина похоже в том, что из if сваливать не хорошо, рано или поздно вернется на end_if

Ды нет, сваливать нехорошо из цикла while. В предыдущих версиях об этом в справке упоминалось.

Напиши так:

Code: (clickermann) [Select]
#name "Browser"

sub(Config, $conf_hwnd, $conf_x, $conf_y, $conf_wide, $conf_height)
   wndpos($conf_hwnd, $conf_x, $conf_y)
   wndsize($conf_hwnd, $conf_wide, $conf_height)
end_sub

sub(WaitOpen)
   while(wndfind("Increase") = 0)
      waitms(200)
   end_cyc
   $page_increase=wndfind("Increase")
   Config($page_increase, 0, 0, 1000+$yourshiftx, 650+$yourshifty)
   logwrite("открылось")
   $wait_download = 60000
   $time = $_ms + $wait_download
   while($time > $_ms)
      hset($page_increase, 1)
      getscreen
      colormode(7,500, 500, 1500,1000)
      if_picture_in(700,700, 1500,1500, "Крестик.bmp", 255, 80)
         logwrite("lol")
         $download_success=1
      ELSE
         $download_success=0
         hset($page_increase, 0)
         wait(1)
      end_if
   end_cyc
   
   SWITCH($download_success) // результат
   CASE(0)
      logwrite("Провал")
   CASE(1)
      logwrite("успех")
   DEFAULT
      // случай по умолчанию
   END_SWITCH
end_sub

sub(WaitClose)
   while(wndfind("Increase") ! 0)
      waitms(200)
   end_cyc
   logwrite("закрылось")
end_sub

sub(Open, $Open_browser, $Open_site)
   execute($Open_browser, $Open_site)
   WaitOpen()
end_sub

sub(Close, $Close_browser)
   execute("TASKKILL",strconcat("/IM ", $browser))
   WaitClose()
end_sub

$browser="Chrome.exe"
$site="http://vk.com/increase.online?mid=21650629"
$yourshiftx=300
$yourshifty=300
Open($browser, $site)
halt // Стопе

PS: подпрограммы нужны чтобы сокращать повторяющиеся части а у тебя наоборот скрипт из за этого удлиняется и запутывается.
Ну вот зачем писать подпрограмму Config(.....) когда можно тупо написать тут же wndpos и wndsize?!
« Last Edit: May 11, 2014, 06:00:03 PM by Oraven »

Shen_De_Lar

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
В последней версии этого в  справке нету. Забавная мелочь, не критичная.
Спасибо, за советы.
Хочу за одно спросить, а можно ли с браузером работать через команды? Интересует работа с вкладками - там  закрыть, обновить, сменить, без анализа графики.
p.s. а еще лучше по моему так:

   $download_success = 0
   $time = $_ms + $wait_download
   while($time > $_ms)
        hset($page_increase, 1)
        getscreen
        colormode(7,500, 500, 1500,1000)
        if_picture_in(700,700, 1500,1500, "Êðåñòèê.bmp", 255, 80)
        $time = $_ms
        $download_success=1
      end_if
      hset($page_increase, 0)
      wait(3)
  end_cyc
...
« Last Edit: May 11, 2014, 07:39:46 PM by Shen_De_Lar »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Ну да конечно там еще $time = 0 нужно приписать чтоб из цикла выйти

Shen_De_Lar

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Обана на что я наткнулся - это же работа с браузером - закрыть, обновить вкладку - ну и с кнопками громкости, медиа плеером и т.д.   http://msdn.microsoft.com/en-us/library/windows/desktop/ms646275(v=vs.85).aspx

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
примерно начиная с версии 4.9 я бы вообще не рекомендовал использовать goto :)

Shen_De_Lar

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Добавь что-то вроде return для подпрограмм. Дабы через это дело можно было выскочить из нее, и не проверять потом полкилометра ненужных условий. Да и возврат значений лишним не будет - чего плодить зря переменные.

mjkl

  • Освоившийся
  • **
  • Posts: 38
    • View Profile
Ды нет, сваливать нехорошо из цикла while. В предыдущих версиях об этом в справке упоминалось.
Успешно сваливаю из while предвратительно указав значение при котором while не "крутит":
Code: (clickermann) [Select]
$b=1
$a=1
WHILE($a=1)
   IF($b=1)
      $a=0
      GOTO(123)
   END_IF
END_CYC
...
123:

З.Ы.
Офтоп
Если выполнять
Code: (clickermann) [Select]
FOR($a=0, $a < 12)
   #include "123.cms"
END_CYC

где 123.cms

Code: (clickermann) [Select]
SUB(MYSUB)
   $a=13
END_SUB
MYSUB()

Код FOR после первого пробега останавливается, потому что $a=13. Если задать число меньше 12 - зацыклит. Хотя в справке написано: После выполнения подпрограммы, сценарий продолжится с момента вызова подпрограммы. Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
А с другой стороны значение $a затягивает в SUB.
« Last Edit: June 01, 2014, 03:31:14 AM by mjkl »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Успешно сваливаю из while предвратительно указав значение при котором while не "крутит":
Code: (clickermann) [Select]
$b=1
$a=1
WHILE($a=1)
   IF($b=1)
      $a=0
      GOTO(123)
   END_IF
END_CYC
...
123:

З.Ы.
Офтоп
Если выполнять
Code: (clickermann) [Select]
FOR($a=0, $a < 12)
   #include "123.cms"
END_CYC

где 123.cms

Code: (clickermann) [Select]
SUB(MYSUB)
   $a=13
END_SUB
MYSUB()

Код FOR после первого пробега останавливается, потому что $a=13. Если задать число меньше 12 - зацыклит. Хотя в справке написано: После выполнения подпрограммы, сценарий продолжится с момента вызова подпрограммы. Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
А с другой стороны значение $a затягивает в SUB.
Не все локальные переменные, а только параметры. Которых у тебя нет.
Еще написано, что подпрограмма должна быть на верхнем уровне.
Её нельзя ложить в условия, циклы и другие подпрограммы. Это относится только к телу саба.
У тебя саб внутри фора посредством инклюда. Саб и не работает.
Саб пихаешь в инклюд, ставишь его в начале. А вызов в цикле.
« Last Edit: June 01, 2014, 11:45:03 AM by Vint »


mjkl

  • Освоившийся
  • **
  • Posts: 38
    • View Profile
Нуууу, вообщем, если не дублировать переменных, то в изложеном виде работает как надо.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ты не понял. Полностью локальная область видимости переменных для подпрограммы не реализована.
Они так же глобальны.
Написано о уничтожении локальных переменных принимающих параметры.
Я не проверял, может и их нельзя дублировать. Скорее всего они просто очистятся чтобы не занимать память.