Call

Материал из UoPilot
Версия от 10:17, 28 августа 2019; Tatikoma (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Описание

Вызывает процедуру созданную по средствам proc.

Синтаксис

Привязка к окну: опциональна.
Работа со свернутым окном: да.
Вызов процедуры: call <имя_процедуры> <передаваемый параметр1> <передаваемый параметр2>...<передаваемый параметрN>
Тело процедуры: proc <имя процедуры> <переменная для приема параметра1><переменная для приема параметра2>...<переменная для приема параметраN> <ваш код> end_proc

set #a 1
set #b 2
call test #a #b

proc test #a1 #b1
    msg #a1 #b1
end_proc

В этом коде переменные #a и #b будут переданы в процедуру под именами #a1 и #b1. Исходные переменные для процедуры будут невидимы, т.к. она по сути является параллельным независимым скриптом. Для обращения к другим скриптам внутри процедуры и возвращения результата необходимо использовать ссылки на параллельные скрипты:

<имя_переменной.номер_вкладки>
#a.3 - сслыка на переменную #a в третьей вкладки скрипта.

Для возвращения результата используйте передачу переменной current_script.

Примеры

// Пример 1
set #a 10
set #b 13
call plus #a #b       //передаём в процедуру 2 переменные
msg $plus             //вернули в скрипт результат из процедуры, обратите внимание переменная имеет тоже имя что процедура
End_script

proc plus #x #y       
   //в процедуре переданные переменные будут с именами #x #y, хотя можно и также было назвать #a #b
    set #z #x + #y    //сложим эти переменные
    set $result #z    //присвоим зарезервированной переменной '$result' результат сложения, чтобы вернуть его в скрипт   
end_proc
// Пример 2
// Проверяем цвет в точке и время ожидания, если цвет будет отсутствовать 5 секунд будет сообщение об этом
call proverka 351 278 14320907 5000     //передаём в процедуру X Y Color Timeout
if $proverka = 1                        //проверяем вышло ли время для ожидания цвета или нет
    msg Время вышло, прошло timer мсек        //что делать если время вышло
    End_script
end_if
msg Цвет найден, прошло timer мсек
End_script

proc proverka #x #y #c #time
while_not #x #y #c         //проверяем пока не найдётся нужный цвет
    if timer > #time       //проверяем не вышло ли время
        set $result 1       //если вышло назначаем переменную
        break               //выходим из while и процедуры
    end_if
end_while
end_proc
// Пример 3
  set #cfound 0 // переменная для получение результатов поиска
  
  call checkcolor 969, 64 1251183 
  if #cfound = 1   
     msg Цвет найден!
  else
     msg Цвет не обнаружен!
  end_if
  end_script
  
  // Проверяет в текущем рабочем окне пиксель с координатами #x, #y на соответствие цвету #c.
  // Результат: глобальная переменная скрипта #cfound=1, если цвет найден; #cfound=0, если не найден 
  proc checkcolor #x #y #c
     set #cs current_script
     set #a findcolor (#x, #y #x, #y 1 1 #c %arr workwindow.#cs )
     if #a > 0
       set #cfound.#cs 1
     else
       set #cfound.#cs 0
     end_if	  
  end_proc

Смотрите также

Proc
Gosub
Goto

История развития

1.03 beta 4
Добавил команды для работы с процедурами call <имя> - вызов процедуры. Процедура с указанным именем ищется сначала в текущем скрипте, а затем, если не найдена, в "файле процедур" - скрипт с номером 99. загрузить туда что-либо можно с помощью соответствующего пункта меню. Поддерживается вложенный вызов процедур. proc <имя> - начало процедуры. Процедуры можно располагать в любом месте программы. При обнаружении начала процедуры, автоматически ищется ее конец, и выполнение продолжается со следующей строки. Вложенное описание не поддерживается. end_proc - конец процедуры

proc saying_message
    say test passed
end_proc
call saying_message
end_script

Процесс выполнения процедуры не отображается, параметры пока не передаются.

2.15
Добавил возможность указывать параметры при вызове процедур. Приём/передача массивов пока не поддерживается:

call test #var1 $var2 "any text" word #var3 
proc test #var4 $var5 $var6     $var7 $var8.

2.20
Исправил вложенный вызов процедур, расположенных в теле родительского скрипта:

set logging open 0 0 440 700
set linedelay 0
set #a 0
call proc
proc proc
    wait 1
    set logging on
    if #a.0 < 20
        set #a.0 #a.0 + 1
        call proc
    end_if
end_proc

2.28
Добавил возможность передавать в подпрограммы массивы. Следите за соответствием типов переменных передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте. Но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование).

set %var [1 1] abc
set %var [1 2] 123
set #e 1
set delimiter '_'
call test2 %var [1 2]  %var [#e]  %var  %var.5 
end_script
proc test2 #v1  $v2  %v3  %v4
set delimiter '^'
set logging Dump:  #v1  $v2  %v3 [1]  %v4 [1]
   // Dump:  123  abc_123  abc^123  abc^123
end_proc

Добавил возврат строкового значения из подпрограммы, с помощью зарезервированной переменной '$result'. При выходе из подпрограммы по ключевому слову 'end_proc', значение переменной '$result' присваивается строковой переменной с именем подпрограммы.

call test
msg $test
end_script
proc test
set $result Test Passed
end_proc

2.33
Исправил передачу в подпрограммы переменных, указанных после массива 'call test %a #l'

2.41
Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.
Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.