progress-4gl
процедуры
Поиск…
Вступление
В Progress ABL есть два типа процедур: внутренние процедуры и прототипы процедур, которые являются фасадами для библиотек Windows или процедур совместной библиотеки Unix / Linux.
Подобно функциям, процедуры не могут быть вложенными. Вы не можете встраивать функции в процедуры и наоборот.
Процедура вызывается с помощью инструкции RUN
.
Синтаксис
RUN procedureurameame. // Запускает процедуру с именем processurename.
RUN proc1 (INPUT "HELLO"). // Вводит строку HELLO в proc1
RUN proc2 (INPUT var1, выход var2). // Вводит var1 и выводит var2 в / из proc2
RUN proc3 (вход "name = 'joe'", OUTPUT TABLE ttResult). // Вводит имя = joe и выводит записи в таблицу
ПРОЦЕДУРА proc: // Объявляет процедуру с именем proc
ПРОЦЕДУРА КОНЕЦ. // Завершает текущую процедуру
Основная внутренняя процедура
В отличие от функций, нет необходимости пересылать декларирование процедуры. Он может быть размещен в любом месте вашего кода до или после его вызова с помощью RUN
.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
Имя процедуры обозначается знаком двоеточия, указывающим, что это начало блока. Блок заканчивается END PROCEDURE.
(но это можно заменить просто END.
).
Параметры INPUT и OUTPUT
Процедура может иметь параметры разных типов: вход, выход, вход-выход (двунаправленный), а также некоторые специальные типы, такие как временные таблицы и наборы данных).
В заявлении выполнения необязательно объявлять INPUT
(он считается дефолтом) - все другие направления должны быть специально объявлены.
Процедура принимает два целых числа в качестве ввода и вывода десятичного числа.
PROCEDURE divideAbyB:
DEFINE INPUT PARAMETER piA AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER piB AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER pdeResult AS DECIMAL NO-UNDO.
pdeResult = piA / piB.
END PROCEDURE.
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
RUN divideAbyB(10, 2, OUTPUT de).
DISPLAY de. //5.00
Параметры полностью необязательны. Вы можете смешивать и сопоставлять все, что хотите. Порядок параметров зависит от вас, но удобно начинать с ввода и заканчивать выходом - вы должны поместить их в правильном порядке в операторе выполнения, и направления смешивания могут быть раздражающими.
Рекурсия - см. Рекурсию
Рекурсия проста - RUN
процедуру самостоятельно изнутри процедуры. Однако, если вы слишком поздно заработаете, у стека закончится свободное пространство.
Процедура расчета факториала.
PROCEDURE factorial:
DEFINE INPUT PARAMETER piNum AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER piFac AS INTEGER NO-UNDO.
DEFINE VARIABLE iFac AS INTEGER NO-UNDO.
IF piNum = 1 THEN DO:
pifac = 1.
END.
ELSE DO:
RUN factorial(piNum - 1, OUTPUT iFac).
piFac = piNum * iFac.
END.
END PROCEDURE.
DEFINE VARIABLE f AS INTEGER NO-UNDO.
RUN factorial(7, OUTPUT f).
DISPLAY f.
Объем
Процедура имеет свой собственный охват. Внешний охват будет «истекать» в процедуру, но не наоборот.
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 1.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
PROCEDURE p:
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 0
j = 2.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 2
Объявление переменной внутри процедуры с тем же именем, что и параметр снаружи, приведет к созданию локальной переменной.
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 1.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
PROCEDURE p:
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 5.
MESSAGE i VIEW-AS ALERT-BOX. // 5
MESSAGE j VIEW-AS ALERT-BOX. // 0
j = 2.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 2
Любая переменная, созданная внутри процедуры, доступна только для этой процедуры.
Это приведет к ошибке компилятора:
PROCEDURE p:
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 5.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // Unknown Field or Variable name i - error 201