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

Материал из UoPilot
Перейти к навигации Перейти к поиску
(Новая страница: « == Описание == Позволяет выделить участок кода в отдельную процедуру и вызвать ее передав...»)
 
 
Строка 5: Строка 5:
 
== Синтаксис ==
 
== Синтаксис ==
 
Привязка к окну: нет.
 
Привязка к окну: нет.
<br>Работа со свернутым окном: да.
+
<br>Работа со свернутым окном: да.
&lt;br>Вызов процедуры:
+
<br>Вызов процедуры:
call &lt;имя_процедуры> &lt;передаваемый параметр1> &lt;передаваемый параметр2>...&lt;передаваемый параметрN>
+
call <имя_процедуры> <передаваемый параметр1> <передаваемый параметр2>...<передаваемый параметрN>
&lt;br>Тело процедуры:
+
<br>Тело процедуры:
proc &lt;имя процедуры> &lt;переменная для приема параметра1>&lt;переменная для приема параметра2>...&lt;переменная для приема параметраN>
+
proc <имя процедуры> <переменная для приема параметра1><переменная для приема параметра2>...<переменная для приема параметраN>
&lt;ваш код>
+
<ваш код>
 
end_proc
 
end_proc
  
Строка 22: Строка 22:
  
 
В этом коде переменные #a и #b будут переданы в процедуру под именами #a1 и #b1. Исходные переменные для процедуры будут невидимы, т.к. она по сути является параллельным независимым скриптом. Для обращения к другим скриптам внутри процедуры и возвращения результата необходимо использовать ссылки на параллельные скрипты:
 
В этом коде переменные #a и #b будут переданы в процедуру под именами #a1 и #b1. Исходные переменные для процедуры будут невидимы, т.к. она по сути является параллельным независимым скриптом. Для обращения к другим скриптам внутри процедуры и возвращения результата необходимо использовать ссылки на параллельные скрипты:
  &lt;имя_переменной'''.'''номер_вкладки>
+
  <имя_переменной'''.'''номер_вкладки>
 
  #a.3 - сслыка на переменную #a в третьей вкладки скрипта.
 
  #a.3 - сслыка на переменную #a в третьей вкладки скрипта.
 
Для возвращения результата используйте передачу переменной [[current_script]].
 
Для возвращения результата используйте передачу переменной [[current_script]].
Строка 85: Строка 85:
  
 
[[Call]]
 
[[Call]]
&lt;br>[[Gosub]]
+
<br>[[Gosub]]
  
 
== История развития ==
 
== История развития ==
Строка 91: Строка 91:
  
 
Добавил команды для работы с процедурами.
 
Добавил команды для работы с процедурами.
call &lt;имя> // Вызов процедуры. процедура с указанным именем ищется сначала в текущем скрипте, а затем, если не найдена, в "файле процедур" - скрипт с номером 99. Загрузить туда что-либо можно с помощью соответствующего пункта меню. Поддерживается вложенный вызов процедур.
+
call <имя> // Вызов процедуры. процедура с указанным именем ищется сначала в текущем скрипте, а затем, если не найдена, в "файле процедур" - скрипт с номером 99. Загрузить туда что-либо можно с помощью соответствующего пункта меню. Поддерживается вложенный вызов процедур.
proc &lt;имя> // Начало процедуры. Процедуры можно располагать в любом месте программы. При обнаружении начала процедуры, автоматически ищется ее конец, и выполнение продолжается со следующей строки. Вложенное описание не поддерживается.
+
proc <имя> // Начало процедуры. Процедуры можно располагать в любом месте программы. При обнаружении начала процедуры, автоматически ищется ее конец, и выполнение продолжается со следующей строки. Вложенное описание не поддерживается.
 
end_proc // Конец процедуры
 
end_proc // Конец процедуры
  
Строка 103: Строка 103:
  
 
'''2.28'''
 
'''2.28'''
&lt;br>добавил возможность передавать в подпрограммы массивы. следите за соответствием типов переменных
+
<br>добавил возможность передавать в подпрограммы массивы. следите за соответствием типов переменных
 
передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте.
 
передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте.
 
но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование)
 
но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование)
Строка 127: Строка 127:
  
 
'''2.39'''
 
'''2.39'''
&lt;br>Исправил ошибку, возникающую, при указании комментария в описании процедуры. "proc test // comment".
+
<br>Исправил ошибку, возникающую, при указании комментария в описании процедуры. "proc test // comment".
  
 
'''2.41'''
 
'''2.41'''
&lt;br>Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.
+
<br>Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.
&lt;br>Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.
+
<br>Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.
  
 
[[Категория:Подпрограммы‏‎]]
 
[[Категория:Подпрограммы‏‎]]

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

Описание

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

Синтаксис

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