Proc

Материал из UoPilot
Перейти к навигации Перейти к поиску

Описание

Позволяет выделить участок кода в отдельную процедуру и вызвать ее передавая параметры. Процедуры имеют отдельную область видимость переменных относительно скриптов.

Синтаксис

Привязка к окну: нет.
Работа со свернутым окном: да.
Вызов процедуры: 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

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

Call
Gosub

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

1.03 beta 4

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

call saying_message
end_script

proc saying_message
  say test passed
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.39
Исправил ошибку, возникающую, при указании комментария в описании процедуры. "proc test // comment".

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