Call: различия между версиями

Материал из UoPilot
Перейти к навигации Перейти к поиску
(Новая страница: « == Описание == Вызывает процедуру созданную по средствам proc. == Синтаксис == Привязка к о...»)
 
 
Строка 5: Строка 5:
 
== Синтаксис ==
 
== Синтаксис ==
 
Привязка к окну: опциональна.
 
Привязка к окну: опциональна.
<br>Работа со свернутым окном: да.
+
<br>Работа со свернутым окном: да.
&lt;br>Вызов процедуры: call &lt;имя_процедуры> &lt;передаваемый параметр1> &lt;передаваемый параметр2>...&lt;передаваемый параметрN>
+
<br>Вызов процедуры: call <имя_процедуры> <передаваемый параметр1> <передаваемый параметр2>...<передаваемый параметрN>
&lt;br>Тело процедуры: proc &lt;имя процедуры> &lt;переменная для приема параметра1>&lt;переменная для приема параметра2>...&lt;переменная для приема параметраN>
+
<br>Тело процедуры: proc <имя процедуры> <переменная для приема параметра1><переменная для приема параметра2>...<переменная для приема параметраN>
&lt;ваш код>
+
<ваш код>
 
end_proc
 
end_proc
  
Строка 20: Строка 20:
  
 
В этом коде переменные #a и #b будут переданы в процедуру под именами #a1 и #b1. Исходные переменные для процедуры будут невидимы, т.к. она по сути является параллельным независимым скриптом. Для обращения к другим скриптам внутри процедуры и возвращения результата необходимо использовать ссылки на параллельные скрипты:
 
В этом коде переменные #a и #b будут переданы в процедуру под именами #a1 и #b1. Исходные переменные для процедуры будут невидимы, т.к. она по сути является параллельным независимым скриптом. Для обращения к другим скриптам внутри процедуры и возвращения результата необходимо использовать ссылки на параллельные скрипты:
  &lt;имя_переменной'''.'''номер_вкладки>
+
  <имя_переменной'''.'''номер_вкладки>
 
  #a.3 - сслыка на переменную #a в третьей вкладки скрипта.
 
  #a.3 - сслыка на переменную #a в третьей вкладки скрипта.
 
Для возвращения результата используйте передачу переменной [[current_script]].
 
Для возвращения результата используйте передачу переменной [[current_script]].
Строка 83: Строка 83:
  
 
[[Proc]]
 
[[Proc]]
&lt;br>[[Gosub]]
+
<br>[[Gosub]]
&lt;br>[[Goto]]
+
<br>[[Goto]]
  
 
== История развития ==
 
== История развития ==
  
 
'''1.03 beta 4'''
 
'''1.03 beta 4'''
&lt;br>Добавил команды для работы с процедурами
+
<br>Добавил команды для работы с процедурами
call &lt;имя> - вызов процедуры. Процедура с указанным именем ищется сначала в текущем скрипте, а затем, если не найдена, в "файле процедур" - скрипт с номером 99. загрузить туда что-либо можно с помощью соответствующего пункта меню. Поддерживается вложенный вызов процедур.
+
call <имя> - вызов процедуры. Процедура с указанным именем ищется сначала в текущем скрипте, а затем, если не найдена, в "файле процедур" - скрипт с номером 99. загрузить туда что-либо можно с помощью соответствующего пункта меню. Поддерживается вложенный вызов процедур.
proc &lt;имя> - начало процедуры. Процедуры можно располагать в любом месте программы. При обнаружении начала процедуры, автоматически ищется ее конец, и выполнение продолжается со следующей строки. Вложенное описание не поддерживается.
+
proc <имя> - начало процедуры. Процедуры можно располагать в любом месте программы. При обнаружении начала процедуры, автоматически ищется ее конец, и выполнение продолжается со следующей строки. Вложенное описание не поддерживается.
 
end_proc - конец процедуры
 
end_proc - конец процедуры
 
  proc saying_message
 
  proc saying_message
Строка 101: Строка 101:
  
 
'''2.15'''
 
'''2.15'''
&lt;br>Добавил возможность указывать параметры при вызове процедур. Приём/передача массивов пока не поддерживается:
+
<br>Добавил возможность указывать параметры при вызове процедур. Приём/передача массивов пока не поддерживается:
 
  call test #var1 $var2 "any text" word #var3  
 
  call test #var1 $var2 "any text" word #var3  
 
  proc test #var4 $var5 $var6    $var7 $var8.
 
  proc test #var4 $var5 $var6    $var7 $var8.
  
 
'''2.20'''
 
'''2.20'''
&lt;br>Исправил вложенный вызов процедур, расположенных в теле родительского скрипта:
+
<br>Исправил вложенный вызов процедур, расположенных в теле родительского скрипта:
 
  set logging open 0 0 440 700
 
  set logging open 0 0 440 700
 
  set linedelay 0
 
  set linedelay 0
Строка 114: Строка 114:
 
     wait 1
 
     wait 1
 
     set logging on
 
     set logging on
     if #a.0 &lt; 20
+
     if #a.0 < 20
 
         set #a.0 #a.0 + 1
 
         set #a.0 #a.0 + 1
 
         call proc
 
         call proc
Строка 121: Строка 121:
  
 
'''2.28'''
 
'''2.28'''
&lt;br>Добавил возможность передавать в подпрограммы массивы. Следите за соответствием типов переменных
+
<br>Добавил возможность передавать в подпрограммы массивы. Следите за соответствием типов переменных
 
передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте.
 
передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте.
 
Но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование).
 
Но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование).
Строка 144: Строка 144:
  
 
'''2.33'''
 
'''2.33'''
&lt;br>Исправил передачу в подпрограммы переменных, указанных после массива 'call test %a #l'
+
<br>Исправил передачу в подпрограммы переменных, указанных после массива 'call test %a #l'
  
 
'''2.41'''
 
'''2.41'''
&lt;br>Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.
+
<br>Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.
&lt;br>Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.
+
<br>Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.
  
 
[[Категория:Подпрограммы]]
 
[[Категория:Подпрограммы]]

Текущая версия на 10:17, 28 августа 2019

Описание

Вызывает процедуру созданную по средствам 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' в процедурах. Присваивание срабатывало только на вызывающий скрипт.