Author Topic: Подпрограмма помогите не доходит  (Read 9376 times)

0 Members and 1 Guest are viewing this topic.

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Подпрограмма помогите не доходит
« on: August 24, 2017, 11:34:44 AM »
Помогите разобраться, что то не могу вникнуть. Данная подпрограмма не работает.
proga.cms
Code: (clickermann) [Select]
SUB(Pod_proga)
LOGWRITE ("Подпрограмма")
END_SUB

GOSUB(Pod_proga)
main.cms
Code: (clickermann) [Select]
#include "proga.cms"
GOSUB(Pod_proga)

HALT

А вообще мне нужно вот это вывести в отдельный файл, что бы вызывалось после нахождения картинки капчи.
[spoiler]
Code: (clickermann) [Select]
GETSCREEN(450,430, 490,470) // Распознать капчу
COLORMODE(6, 450,430, 490,470)
IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // после нахождения этого окошка с капчей что бы сработала подпрограмма
   $cap4a = 1
   WHILE($cap4a = 1) // цикл распознавания капчи
 
      WAIT(1)
      $hwnd = wndFind("AGClient v1.5") // находим окно
      LOGWRITE ("AGClient hwnd: ", $hwnd)
 
      TFCLEAR("out.txt")
      WAITMS(50)
      TFWRITE("out.txt", "0")
      waitms(200)
 
      PostMessage($hwnd, 0x555, 5, 0) // распознать
      waitms(200)
      $response = 0
 
      WHILE($response = 0)
         $response = TFREAD("out.txt", 1)
         WAITMS(500)
      END_CYC
 
      IF ($response = 1)
         $str = TFREAD("out.txt", 2)
         LOGWRITE ("Распознано. Ответ: ", $str)
         FOR($step=1,$step<4)
            $click=STRCUT($str,$step,1)
            WAITMS(100)
            SWITCH($click)
            CASE(1)
               LCLICK(350,330)
            CASE(2)
               LCLICK(475,330)
            CASE(3)
               LCLICK(600,330)
            CASE(4)
               LCLICK(350,390)
            CASE(5)
               LCLICK(475,390)
            CASE(6)
               LCLICK(600,390)
            CASE(7)
               LCLICK(350,455)
            CASE(8)
               LCLICK(475,455)
            CASE(9)
               LCLICK(600,455)
            END_SWITCH
         END_CYC
         WAITMS(100)
         LCLICK(480,520) // отправить
         WAITMS(300)
         $cap4a = 0 // после ввода выходим из цикла
      END_IF
      IF ($response = 2)
         LOGWRITE ("НЕ распознано. Ошибка!")
         WAITMS(300)
      END_IF
   END_CYC
END_IF
[/spoiler]

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #1 on: August 24, 2017, 01:36:59 PM »
Ты где "GOSUB" нарыл? Это антиквариат. С версии v4.9 подпрограммы вызываются по имени.

В справку опять не заглядываешь?


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #2 on: August 24, 2017, 02:38:53 PM »
Ты где "GOSUB" нарыл? Это антиквариат. С версии v4.9 подпрограммы вызываются по имени.

В справку опять не заглядываешь?
Нарыл тут http://crapware.aidf.org/forum/index.php?topic=33.msg708#msg708
В справке не разобрался(

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #3 on: August 24, 2017, 04:12:34 PM »
А дата? Там же 2012 год.

В этом проблема поиска решения в закромах форума или VK (и ютубы туда же) - устаревание информации. Нужно всегда смотреть на дату и сопоставлять версии программы.

Как можно не разобраться в справке? До сих пор не открывается?


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #4 on: August 25, 2017, 12:30:38 AM »
А дата? Там же 2012 год.

В этом проблема поиска решения в закромах форума или VK (и ютубы туда же) - устаревание информации. Нужно всегда смотреть на дату и сопоставлять версии программы.

Как можно не разобраться в справке? До сих пор не открывается?
Ну то что нет свежих постов я не виноват.
Справка открывается и даже нашел раздел с "основные конструкции" SUB (подпрограммы) даже прочел все 3 раза, либо я тупой либо справка не понятно написана. В справке нет примера с инклюде, я не программист, программный язык для меня как космос.
Code: (clickermann) [Select]
// Тело подпрограммы
sub(cap4a)
$cap4a = 1
WHILE($cap4a = 1) // цикл распознавания капчи
   
   WAIT(1)
   $hwnd = wndFind("AGClient v1.5") // находим окно
   LOGWRITE ("AGClient hwnd: ", $hwnd)
   
   TFCLEAR("out.txt")
   WAITMS(50)
   TFWRITE("out.txt", "0")
   waitms(200)
   
   PostMessage($hwnd, 0x555, 5, 0) // распознать
   waitms(200)
   $response = 0
   
   WHILE($response = 0)
      $response = TFREAD("out.txt", 1)
      WAITMS(500)
   END_CYC
   
   IF ($response = 1)
      $str = TFREAD("out.txt", 2)
      LOGWRITE ("Распознано. Ответ: ", $str)
      FOR($step=1,$step<4)
         $click=STRCUT($str,$step,1)
         WAITMS(100)
         SWITCH($click)
         CASE(1)
            LCLICK(350,330)
         CASE(2)
            LCLICK(475,330)
         CASE(3)
            LCLICK(600,330)
         CASE(4)
            LCLICK(350,390)
         CASE(5)
            LCLICK(475,390)
         CASE(6)
            LCLICK(600,390)
         CASE(7)
            LCLICK(350,455)
         CASE(8)
            LCLICK(475,455)
         CASE(9)
            LCLICK(600,455)
         END_SWITCH
      END_CYC
      WAITMS(100)
      LCLICK(480,520) // отправить
      WAITMS(300)
      $cap4a = 0 // после ввода выходим из цикла
   END_IF
   IF ($response = 2)
      LOGWRITE ("НЕ распознано. Ошибка!")
      WAITMS(300)
   END_IF
END_CYC
end_sub

// Строка в основном скрипте если нашлась капча вызывается подпрограмма
GETSCREEN(450,430, 490,470) // Поиск капчи
COLORMODE(6, 450,430, 490,470)
IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // капча нашлась
// вызов подпрограммы
#include "cap4a.cms"
cap4a()
END_IF
Так правильно?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #5 on: August 25, 2017, 08:11:57 AM »
Почти.
#include "cap4a.cms" не нужно писать внутри условия. Пиши в начале скрипта.


С #include всё просто, как табуретка. Перед запуском скрипта, скрипт пробегается как текстовый файл. Все найденные #include заменяются в этом же месте где он стоит кодом из указанного файла.

Сделай файл БЕЗ #include, потом то, что хочешь вынести в отдельный файл туда убирай и на этом месте пиши #include. Не можешь это сделать мысленно - сделай на яву.

Сейчас в твоём коде если содержимое из "cap4a.cms" (подпрограмму) вставить туда, где оно появится, то выйдет:
Code: (clickermann) [Select]
IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // капча нашлась
    // Тело подпрограммы
    sub(cap4a)
        // цикл распознавания капчи
    end_sub
    // вызов подпрограммы
    cap4a()
END_IF

Это неправильно! Тело подпрограммы (SUB...END_SUB) не может быть вложено. Ни в условия ни в циклы.


Ну то что нет свежих постов я не виноват.
Это ты пошутил так? В каждом 10 ответе есть пример с вызовом подпрограммы. Вот из последних прямо по последним постам
http://crapware.aidf.org/forum/index.php?topic=3409.msg23273#msg23273
http://crapware.aidf.org/forum/index.php?topic=3397.msg23321#msg23321

Ты так и будешь дальше ничего не понимать, пока будешь учить синтаксис не из справки, а по чужим постам на форуме. Там люди решают свои проблемы. И никто не будет писать "новые посты" переписывая туда инфу из справки, это мартышкин труд (для нерускоязычных - это фразеологизм такой).
« Last Edit: August 25, 2017, 08:22:53 AM by Vint »


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #6 on: August 28, 2017, 12:52:44 PM »
Quote
Vint
Спасибо большое. Теперь стало понятно, оказалось действительно все очень легко и просто :)

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #7 on: August 28, 2017, 01:02:40 PM »
Ребят помогите в подпрограмму добавить, проверку ушла ли капча, если нет то повторить распознавание 3 раза, если все равно капча не ушла то остановить скрипт. А то случается так, что капча зависает и происходит безостановочное распознавание.
[spoiler]
Code: (clickermann) [Select]
sub(cap4a)
   GETSCREEN(450,430, 490,470)
   COLORMODE(6, 450,430, 490,470)
   IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // Капча нашлась
      $cap4a = 1
      WHILE($cap4a = 1) // цикл распознавания капчи
         // Область снимка капчи
         $x1 = 285
         $y1 = 160
         $x2 = 675
         $y2 = 280
         
         WAIT(1)
         $hwnd = wndFind("AGClient v1.5") // находим окно
         LOGWRITE ("AGClient hwnd: ", $hwnd)
         
         TFCLEAR("out.txt")
         WAITMS(50)
         TFWRITE("out.txt", "0")
         waitms(200)
         
         // последовательное задание координат
         PostMessage($hwnd, 0x555, 1, $x1)
         PostMessage($hwnd, 0x555, 2, $y1)
         PostMessage($hwnd, 0x555, 3, $x2)
         PostMessage($hwnd, 0x555, 4, $y2)
         PostMessage($hwnd, 0x555, 5, 0) // распознать
         waitms(200)
         $response = 0
         
         WHILE($response = 0)
            $response = TFREAD("out.txt", 1)
            WAITMS(500)
         END_CYC
         
         IF ($response = 1)
            $str = TFREAD("out.txt", 2)
            LOGWRITE ("Распознано. Ответ: ", $str)
            FOR($step=1,$step<4)
               $click=STRCUT($str,$step,1)
               WAITMS(100)
               SWITCH($click)
               CASE(1)
                  LCLICK(350,330)
               CASE(2)
                  LCLICK(475,330)
               CASE(3)
                  LCLICK(600,330)
               CASE(4)
                  LCLICK(350,390)
               CASE(5)
                  LCLICK(475,390)
               CASE(6)
                  LCLICK(600,390)
               CASE(7)
                  LCLICK(350,455)
               CASE(8)
                  LCLICK(475,455)
               CASE(9)
                  LCLICK(600,455)
               END_SWITCH
            END_CYC
            WAITMS(100)
            LCLICK(480,520) // отправить
            WAITMS(300)
            $cap4a = 0 // после ввода выходим из цикла
         END_IF
         IF ($response = 2)
            LOGWRITE ("НЕ распознано. Ошибка!")
            WAITMS(300)
         END_IF
      END_CYC
   END_IF
end_sub
[/spoiler]

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #8 on: August 28, 2017, 02:50:41 PM »
Что означает проверка "ушла ли капча". Ушла на распознавание в AGC? Или AGC вернул распознавание удачно?
Или "ушла" в смысле принята твоей программой?


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #9 on: August 28, 2017, 03:04:00 PM »
Вот если пришёл ответ "не распознана" или в течении 60 секунд ответа нет - отправляем заново. И так 3 раза.
Если 3 раза неудача - HALT
Code: (clickermann) [Select]
WAIT(1)
$hwnd = wndFind("AGClient v1.5") // находим окно
LOGWRITE ("AGClient hwnd: ", $hwnd)

$x1 = 285
$y1 = 160
$x2 = 675
$y2 = 280



SUB(cap4a)
    GETSCREEN(450,430, 490,470)
    COLORMODE(6, 450,430, 490,470)
    IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // Капча нашлась
        FOR($cap4a=0, $cap4a < 3) // цикл распознавания капчи
            // Область снимка капчи
           
            TFCLEAR("out.txt")
            WAITMS(50)
            TFWRITE("out.txt", "0")
            waitms(200)
           
            // последовательное задание координат
            PostMessage($hwnd, 0x555, 1, $x1)
            PostMessage($hwnd, 0x555, 2, $y1)
            PostMessage($hwnd, 0x555, 3, $x2)
            PostMessage($hwnd, 0x555, 4, $y2)
            PostMessage($hwnd, 0x555, 5, 0) // распознать
            waitms(200)
            $response = 0
           
            $time_cap4a = $_time_t + 60  // ограничение 60 сек на ответ
            WHILE(($response = 0) & ($time_cap4a < $_time_t))
                $response = TFREAD("out.txt", 1)
                WAITMS(500)
            END_CYC
           
            IF($response = 1)
                $str = TFREAD("out.txt", 2)
                LOGWRITE("Распознано. Ответ: ", $str)
                FOR($step=1, $step < 4)
                    $click = STRCUT($str, $step, 1)
                    WAITMS(100)
                    SWITCH($click)
                    CASE(1)
                        LCLICK(350,330)
                    CASE(2)
                        LCLICK(475,330)
                    CASE(3)
                        LCLICK(600,330)
                    CASE(4)
                        LCLICK(350,390)
                    CASE(5)
                        LCLICK(475,390)
                    CASE(6)
                        LCLICK(600,390)
                    CASE(7)
                        LCLICK(350,455)
                    CASE(8)
                        LCLICK(475,455)
                    CASE(9)
                        LCLICK(600,455)
                    END_SWITCH
                END_CYC
                WAITMS(100)
                LCLICK(480,520) // отправить
                WAITMS(300)
                $cap4a = 100 // после ввода выходим из цикла
            END_IF
            IF(($response = 2) | ($response = 0))
                LOGWRITE ("НЕ распознано. Ошибка!")
                WAITMS(300)
            END_IF
        END_CYC
        IF($cap4a < 100)
            LOGWRITE ("Всё пропало, шеф! Ничего не получилось.")
            HALT
        END_IF
    END_IF
END_SUB


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #10 on: August 28, 2017, 03:32:49 PM »
Что означает проверка "ушла ли капча".
Нужно проверить ушло ли окно капчи если окно капчи не уходит нужно остановить кликер. Потому как бывает капча зависает или окошко с цифрами не появилось, то происходит постоянное распознавание а мне надо что бы 3-5 раз проверил если окошко не ушло то скрипт полностью остановился
Вот если эта картинка зависла по каким то причинам не уходит то нужно полностью остановить кликер
Code: (clickermann) [Select]
   GETSCREEN(450,430, 490,470)
   COLORMODE(6, 450,430, 490,470)
   IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // Капча нашлась
« Last Edit: August 28, 2017, 03:36:29 PM by Ramzesia »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #11 on: August 28, 2017, 04:37:30 PM »
Code: (clickermann) [Select]
WAIT(1)
$hwnd = wndFind("AGClient v1.5") // находим окно
LOGWRITE ("AGClient hwnd: ", $hwnd)

// Область снимка капчи
$x1 = 285
$y1 = 160
$x2 = 675
$y2 = 280


SUB(cap4a)
    FOR($cap4a=0, $cap4a < 3) // цикл распознавания капчи
        GETSCREEN(450,430, 490,470)
        COLORMODE(6, 450,430, 490,470)
        IF_PICTURE_IN (450,430, 490,470, "texture\K.bmp", -1, 70) // Капча нашлась
            TFCLEAR("out.txt")
            WAITMS(50)
            TFWRITE("out.txt", "0")
            waitms(200)
           
            // последовательное задание координат
            PostMessage($hwnd, 0x555, 1, $x1)
            PostMessage($hwnd, 0x555, 2, $y1)
            PostMessage($hwnd, 0x555, 3, $x2)
            PostMessage($hwnd, 0x555, 4, $y2)
            PostMessage($hwnd, 0x555, 5, 0) // распознать
            waitms(200)
            $response = 0
           
            $time_cap4a = $_time_t + 60  // ограничение 60 сек на ответ
            WHILE(($response = 0) & ($time_cap4a < $_time_t))
                $response = TFREAD("out.txt", 1)
                WAITMS(500)
            END_CYC
           
            IF($response = 1)
                $str = TFREAD("out.txt", 2)
                LOGWRITE("Распознано. Ответ: ", $str)
                FOR($step=1, $step < 4)
                    $click = STRCUT($str, $step, 1)
                    WAITMS(100)
                    SWITCH($click)
                    CASE(1)
                        LCLICK(350,330)
                    CASE(2)
                        LCLICK(475,330)
                    CASE(3)
                        LCLICK(600,330)
                    CASE(4)
                        LCLICK(350,390)
                    CASE(5)
                        LCLICK(475,390)
                    CASE(6)
                        LCLICK(600,390)
                    CASE(7)
                        LCLICK(350,455)
                    CASE(8)
                        LCLICK(475,455)
                    CASE(9)
                        LCLICK(600,455)
                    END_SWITCH
                END_CYC
                WAITMS(100)
                LCLICK(480,520) // отправить
                WAITMS(300)
                $cap4a = 100 // после ввода выходим из цикла
            END_IF
            IF(($response = 2) | ($response = 0))
                LOGWRITE ("НЕ распознано. Ошибка!")
                WAITMS(300)
            END_IF
        END_IF
    END_CYC
    IF($cap4a < 100)
        LOGWRITE ("Всё пропало, шеф! Ничего не получилось.")
        HALT
    END_IF
END_SUB


Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #12 on: August 28, 2017, 08:29:56 PM »
Сори за назойливость, просто хочу понять как это работает.
Почему это ты вынес за пределы подпрограммы? И куда его вписать в основной скрипт? Оно вить не сработает если оставить так, это подключаемый файл.
Code: (clickermann) [Select]
WAIT(1)
$hwnd = wndFind("AGClient v1.5") // находим окно
LOGWRITE ("AGClient hwnd: ", $hwnd)
 
// Область снимка капчи
$x1 = 285
$y1 = 160
$x2 = 675
$y2 = 280

Если я не ошибаюсь это проверит наличие капчи "картинка окна" 2 раза
Code: (clickermann) [Select]
FOR($cap4a=0, $cap4a < 3) // цикл распознавания капчи
И вот это не понятно, насколько моего воображения хватило, мне кажется что все остановится при первом неудачном распознавании.
Code: (clickermann) [Select]
    IF($cap4a < 100)
        LOGWRITE ("Всё пропало, шеф! Ничего не получилось.")
        HALT
    END_IF

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #13 on: August 28, 2017, 08:46:52 PM »
Почему это ты вынес за пределы подпрограммы? И куда его вписать в основной скрипт? Оно вить не сработает если оставить так, это подключаемый файл.
Можешь вписать в основной или оставить так. Сработает полюбому.
Если я не ошибаюсь это проверит наличие капчи "картинка окна" 2 раза
Ошибаешься. Первая проверка=0, вторая=1, третья=2. Цикл повторяется пока переменная меньше 3.
И вот это не понятно, насколько моего воображения хватило, мне кажется что все остановится при первом неудачном распознавании.
Так как это условие вынесено за пределы цикла, проверка будет выполнена только после его завершения.

Ramzesia

  • Активный участник
  • ***
  • Posts: 263
    • View Profile
Re: Подпрограмма помогите не доходит
« Reply #14 on: August 28, 2017, 08:53:43 PM »
Ок спасибо за помощь и разъяснения. Пойду пробовать.