Author Topic: SUB (подпрограммы) и возвращение значений или переменных  (Read 10233 times)

0 Members and 2 Guests are viewing this topic.

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Данный код хотелось вынести из основного тела для упрощения дописывания кода
и добавления функций

Code: (clickermann) [Select]
//=============================================//include

#include "2check.cms"

//=============================================//settings

$hwnd = 3351192
$a = 4

//=============================================//body

2check ($a)             //чтобы можно было воткнуть в функцию к примеру

//ПРИМЕР
switch(2check ($p ,$s))
case($p ,$s)
  //действие
case($p ,$s)
  //действие
case($p ,$s)
  //действие
default
  //действие
end_switch



Code: (clickermann) [Select]
SUB(2check, $a)
$pref="textures\pref" //

$x1 = 690               //$x1 = 699
$y1 = 420 //$y1 = 429
$x2 = 710 //$x2 = 705
$y2 = 440 //$y2 = 438

GETSCREEN
COLORMODE(8, 695, 415, 715, 445)
//screenshotex(699, 429, 705, 438, "pref") //
//HINTPOPUP (" ggg ")

FOR ($i=0, (($i < $a)|($i = $a)), 1)
//HINTPOPUP ("   test"$i   )
//WAIT(3)
WAITMS(10)

IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))

if(($i > 0)&($i < $a))
HINTPOPUP (" za"$i)
WAITMS(10)
//WAIT(3)
//присвоить переменной значение, или создать переменную или несколько переменных которая передается в основное тело программы и
                                        //закончить подпрограмму примерно так return ($p = 1, $s = 1)
end_if

if($i = 0)
HINTPOPUP (" Kristali ")
BEEP(190,1000)               //
//HALT
//WAIT(3)
                                        //присвоить переменной значение, или создать переменную или несколько переменных которая передается в основное тело программы и
                                        //закончить подпрограмму примерно так return ($p = 2, $s = 2)
end_if

if($i = $a)
HINTPOPUP (" ravno " $a )
                                        //присвоить переменной значение, или создать переменную или несколько переменных которая передается в основное тело программы и
                                        //закончить подпрограмму примерно так return ($p = 3, $s = 3)
end_if

if($i ! $a)
HINTPOPUP (" ne naudeno " $a )
screenshotex(699, 429, 705, 438, "pref")
                                        //присвоить переменной значение, или создать переменную или несколько переменных которая передается в основное тело программы и
                                        //закончить подпрограмму примерно так return ($p = 4, $s = 4)
end_if

end_if
END_CYC
END_SUB


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Опять нечто немыслимое пишешь?
$p и $s имеют одно и тоже значение, достаточно проанализировать одну переменную.
В свитче нельзя использовать несколько переменных.

Вот верный код
Code: (clickermann) [Select]
//=============================================//include

#include "2check.cms"

//=============================================//settings

$hwnd = 3351192
$a = 4

//=============================================//body

2check ($a)             //чтобы можно было воткнуть в функцию к примеру

//ПРИМЕР
switch($p)
case(1)
   //действие
case(2)
   //действие
case(3)
   //действие
default
   //действие
end_switch

У HINTPOPUP есть заголовок.   
Code: (clickermann) [Select]
HINTPOPUP("Сообщение", "Заголовок")В твоем случае можно написать так
Code: (clickermann) [Select]
HINTPOPUP ($i," za")так хотя бы будет правильно.

ksa-nsk

  • Освоившийся
  • **
  • Posts: 55
    • View Profile
$hwnd = 3351192 - вам виднее, но при каждом запуске программы у этой переменной будет новое значение, рекомендую искать окно по названию и с ним потом работать.

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
$hwnd = 3351192 - вам виднее, но при каждом запуске программы у этой переменной будет новое значение, рекомендую искать окно по названию и с ним потом работать.
Это был пример, я  выкладываю в тему сухой  пример с  вырезанными основними элементами.
Привязки по названию окна не действительна  при использовании нескольких окон, поэтому  приходится  пользоваться  именно $hwnd
а так как  клиен перезапускается  ну максимум  2а раза  в  сутки, то это не считается проблемой.

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Опять нечто немыслимое пишешь?
$p и $s имеют одно и тоже значение, достаточно проанализировать одну переменную.
В свитче нельзя использовать несколько переменных.

Вот верный код
Code: (clickermann) [Select]
//=============================================//include

#include "2check.cms"

//=============================================//settings

$hwnd = 3351192
$a = 4

//=============================================//body

2check ($a)             //чтобы можно было воткнуть в функцию к примеру

//ПРИМЕР
switch($p)
case(1)
   //действие
case(2)
   //действие
case(3)
   //действие
default
   //действие
end_switch

У HINTPOPUP есть заголовок.   
Code: (clickermann) [Select]
HINTPOPUP("Сообщение", "Заголовок")В твоем случае можно написать так
Code: (clickermann) [Select]
HINTPOPUP ($i," za")так хотя бы будет правильно.


2е переменные это пример, я  же не написал точные значения, это был пример
и если переменные создаются в подпрограмме они же должны удаляться.
Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
И да я в примере допустил ошибки и не точное описание примера, и если оно все таки должно выполняться по такому
принципу как я понял по вашему коду, то  код  должен выглядеть так?
Code: (clickermann) [Select]
#include "2check.cms"
 
//=============================================//settings
 
$hwnd = 3351192
$a = 4
$p = -1
$s = -1
 
//=============================================//body
 
2check ($a, $p, $s)             //чтобы можно было воткнуть в функцию к примеру
 
//ПРИМЕР
switch($p)

case(1)
  if($s = 2)
   //действие
  else
   //действие2
  end_if

case(2)
   if($s = 2)
   //действие
  else
   //действие2
  end_if

case(3)
   if($s = 2)
   //действие
  else
   //действие2
  end_if

default
   if($s = 2)
   //действие
  else
   //действие2
  end_if

end_switch


А сама подпрограмма должна выглядеть таким образом.
Code: (clickermann) [Select]
SUB(2check, $a, $p, $s)
$pref="textures\pref" //
 
$x1 = 690               //$x1 = 699
$y1 = 420 //$y1 = 429
$x2 = 710 //$x2 = 705
$y2 = 440 //$y2 = 438
 
GETSCREEN
COLORMODE(8, 695, 415, 715, 445)
//screenshotex(699, 429, 705, 438, "pref") //
//HINTPOPUP (" ggg ")
 
FOR ($i=0, (($i < $a)|($i = $a)), 1)
//HINTPOPUP ("   test"$i ,  )
//WAIT(3)
WAITMS(10)
 
IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))
 
if(($i > 0)&($i < $a))
HINTPOPUP (" za"$i ,)
WAITMS(10)
//WAIT(3)
//присвоить переменной значение, функция с проверкой на  действие и присвоение 2й переменной  определенного значения
                                        //закончить подпрограмму примерно так return ($p = 1, $s = 1 или 2 итд )
end_if
 
if($i = 0)
HINTPOPUP (" Kristali ",)
BEEP(190,1000)               //
//HALT
//WAIT(3)
                                        //присвоить переменной значение, функция с проверкой на  действие и присвоение 2й переменной  определенного значения
                                        //закончить подпрограмму примерно так return ($p = 2, $s = 1 или 2 итд )
end_if
 
if($i = $a)
HINTPOPUP (" ravno " $a , )
                                        //присвоить переменной значение, функция с проверкой на  действие и присвоение 2й переменной  определенного значения
                                        //закончить подпрограмму примерно так return ($p = 2, $s = 1 или 2 итд )
end_if
 
if($i ! $a)
HINTPOPUP (" ne naudeno " $a , )
screenshotex(699, 429, 705, 438, "pref")
                                        //присвоить переменной значение, функция с проверкой на  действие и присвоение 2й переменной  определенного значения
                                        //закончить подпрограмму примерно так return ($p = 4, $s = 1 или 2 итд )
end_if
 
end_if
END_CYC
END_SUB

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
В кликермэне SUB это именно подпрограммы, не функции они ничего не возвращают.
Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
Здесь речь идёт только о переменных принимающих параметры
SUB(2check, $a, $p, $s)
Все остальные использующиеся переменные, даже в теле подпрограммы глобальны.

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


Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Каким образом можно остановить подпрограмму в if, for, итд ?
Можно пример пожалуста.
Code: (clickermann) [Select]
SUB(2check, $a, $p, $s)
$pref="textures\pref" //
 
$x1 = 690               //$x1 = 699
$y1 = 420 //$y1 = 429
$x2 = 710 //$x2 = 705
$y2 = 440 //$y2 = 438
 
GETSCREEN
COLORMODE(8, 695, 415, 715, 445)
//screenshotex(699, 429, 705, 438, "pref") //
//HINTPOPUP (" ggg ")
 
FOR ($i=0, (($i < $a)|($i = $a)), 1)
//HINTPOPUP ("   test"$i ,  )
//WAIT(3)
WAITMS(10)
 
IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))
 
if(($i > 0)&($i < $a))
HINTPOPUP (" za"$i ,)
WAITMS(10)
END_SUB                                  //так?
end_if
 
if($i = 0)
HINTPOPUP (" Kristali ",)
BEEP(190,1000)               //
END_SUB                                  //так?
end_if
 
if($i = $a)
HINTPOPUP (" ravno " $a , )
                                        END_SUB                                  //так?
end_if
 
if($i ! $a)
HINTPOPUP (" ne naudeno " $a , )
screenshotex(699, 429, 705, 438, "pref")
                                        END_SUB                                  //так?
end_if
 
end_if
END_CYC
END_SUB
« Last Edit: November 11, 2014, 08:45:39 PM by mrGod »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Чем отличаются эти таки. END_SUB это не выход из подпрограммы,  это окончание блока.
Внутри все организовывай условиями. В чем трудность? Ну не хочешь много вложенных условий прыгай по GOTO на метку перед самым эндсабом.


Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Чем отличаются эти таки. END_SUB это не выход из подпрограммы,  это окончание блока.
Внутри все организовывай условиями. В чем трудность? Ну не хочешь много вложенных условий прыгай по GOTO на метку перед самым эндсабом.

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Можно пример, меня что то переклинило понять не могу, или поздно, или совсем плохой стал.
Пример конечно ещё тот.  Зачем эта гора HINTPOPUP которые все могут сработать за 100 мс? Ты всё равно их все не увидишь и не поймёшь что было. Что пример должен то делать?
Если тебе нужно при нахождении картинки прервать цикл и выйти из подпрограммы, то сделай так, чтобы на следующем проходе условие цикла больше не было верным. В данном тобой примере это достаточно сделать 1 раз, т.к.  IF-ы перекрывают весь диапазон $i  от 0 до $a
Code: (clickermann) [Select]
SUB(2check, $a, $p, $s)
   $pref="textures\pref"
   $x1 = 690  //$x1 = 699
   $y1 = 420 //$y1 = 429
   $x2 = 710 //$x2 = 705
   $y2 = 440 //$y2 = 438

   GETSCREEN
   COLORMODE(8, 695, 415, 715, 445)   
   FOR ($i=0, $i < ($a+1))     
      IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))
         IF(($i > 0)&($i < $a))
            HINTPOPUP (" za", $i)
            WAITMS(10)
         END_IF
         
         IF($i = 0)
            HINTPOPUP (" Kristali ")
            BEEP(190,1000)
         END_IF
         
         IF($i = $a)
            HINTPOPUP (" ravno ", $a)
         END_IF
         
         IF($i ! $a)
            HINTPOPUP (" ne naudeno ", $a)
            screenshotex(699, 429, 705, 438, "pref")
         END_IF
         // делаем так, будто все i уже прошли
         $i = $a+1
      END_IF
      WAITMS(100)
   END_CYC
END_SUB

Кстати, последние 2 условия можно написать в одном:
Code: (clickermann) [Select]
         IF($i = $a)
            HINTPOPUP (" ravno ", $a)
         ELSE
            HINTPOPUP (" ne naudeno ", $a)
            screenshotex(699, 429, 705, 438, "pref")
         END_IF

И всё равно это не правильно, зачем оповещать (" ne naudeno ", $a) когда мы до $a можем и не дойти.
« Last Edit: November 12, 2014, 10:09:26 AM by Vint »


Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
HINTPOPUP нужны  для  того чтобы проверить работоспособность кода, и  чтобы  его заменить на другой код с определенными действиями.
По поводу
Code: (clickermann) [Select]
IF($i ! $a)
   HINTPOPUP (" ne naudeno ", $a)
   screenshotex(699, 429, 705, 438, "pref")
END_IF
Это необходимый код для меня при условии не  схождения  с  остальными условиями в  моем  коде  должно прорабатываться  отдельное действие.
Вообще имеются 3 картинки  при  схождении которых должно прорабатываться отдельные действия и определенное количество картинок при которых или  действие повторяется или останавливается с переходом в другую функцию.
Я же все таки не просто так задал все  if они необходимы в моем коде.
Про последнее сравнение вы  правы, но про $a = $a +1  эту функцию выполняет FOR ($i=0, (($i < $a)|($i = $a)), 1)

Вывод:
Я понял из всего, что умнее использовать в подпрограмме goto(*) c ссылкой в основное тело программы, при совпадении условий, и не придумывать
 велосипед, пока разработчик не добавил данных возможностей работы с кодом.(верен?)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Про последнее сравнение вы  правы, но про $a = $a +1  эту функцию выполняет FOR ($i=0, (($i < $a)|($i = $a)), 1)
Нет! FOR наращивает $i от 0 до $a включительно.
А $i = $a+1  (у меня написано так, а не $a = $a +1) делает так чтобы FOR больше не выполнялся


Вывод:
Я понял из всего, что умнее использовать в подпрограмме goto(*) c ссылкой в основное тело программы, при совпадении условий, и не придумывать
 велосипед, пока разработчик не добавил данных возможностей работы с кодом.(верен?)
Вывод в корне не верен. Оно то конечно пока и так будет работать, но лучше к этому не привыкать. Тем более в этом случае, когда всё просто.



Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Понятно, легче простыню в одном файле писать чем, использовать то что имеется в  данный момент и придумывать велосипед.
Спасибо за разъяснение закрываю тему.