Процедуры без параметров. Глобальные переменные.
В языке Progress предусмотрены описание и вызов внешних и внутренних процедур. Каждая внешняя процедура хранится в отдельном файле, она не содержит заголовка и ее имя определяется именем файла. Внутренние процедуры располагаются в конце файла, в котором хранится вызывающая их процедура. Описание внутренней процедуры:
PROCEDURE proc-name:
. . .
END [PROCEDURE].
Вызов процедуры без параметров выглядит так:
RUN proc-name.
где proc-name
- идентификатор процедуры (для внешней процедуры - имя файла, в котором хранится процедура);
- VALUE(string-expression),где string-expression - строковое выражение, выдающее идентификатор внешней или внутренней процедуры.
При вызове процедуры можно использовать опцию NO-ERROR.
Внутренние процедуры могут использовать переменные из соответствующей внешней процедуры.
Внешние процедуры могут обмениваться данными через глобальные переменные.
Описание глобальной переменной в вызывающей процедуре выглядит так:
DEFINE NEW SHARED VARIABLE I ....
а в вызываемой процедуре:
DEFINE SHARED VARIABLE I ....
Пример 1.9.1
Программа по радиусу определяет длину окружности и площадь соответствующего круга.
DEFINE NEW SHARED VARIABLE r AS DECIMAL FORMAT "999.99".
DEFINE NEW SHARED VARIABLE s AS DECIMAL FORMAT "999.99".
DEFINE NEW SHARED VARIABLE p AS DECIMAL FORMAT "999.99".
SET r.
RUN ps.p.
RUN pp.p.
DISPLAY s p.
Процедура ps.p:
DEFINE SHARED VARIABLE r AS DECIMAL.
DEFINE SHARED VARIABLE s AS DECIMAL.
s = 3.1415 * r * r .
Процедура pp.p:
DEFINE SHARED VARIABLE r AS DECIMAL.
DEFINE SHARED VARIABLE p AS DECIMAL.
p = 3.1415 * r * 2 .
В последнее время (с сентября 1996 года) помимо внутренних и внешних процедур в Progress появилось понятие удаленной процедуры (remote procedure). Реализация этого механизма происходит через Компонентный сервер приложений (AppServer), который запускается в сети в непосредственной близости от данных. Это позволяет выделить бизнес-логику из приложения и приблизить ее к данным, уменьшая тем самым сетевой трафик. Здесь речь идет уже о N-уровневой архитектуре клиент/сервер, когда сервер выполняет свои прежние функции, за клиентской частью остается интерактивная работа, а массированную обработку данных берут на себя удаленные процедуры при компонентных серверах.
Процедуры и функции с параметрами
Наиболее распространенный способ передачи параметров - с указанием типа передачи параметра. Предусмотрены три типа передачи параметра:
INPUT - параметр используется как входной,
OUTPUT - параметр используется как выходной,
INPUT-OUTPUT - параметр используется при входе и выходе из процедуры.
Возможно использование пользовательских как процедур, так и функций с параметрами.
Способ передачи параметров указывается при описании формальных параметров процедуры (функции) и при вызове процедуры (функции) (по умолчанию параметры передаются как INPUT).
Пример 1.10.1
Программа, вычисляющая корни квадратного уравнения.
DEFINE VARIABLE a AS DECIMAL FORMAT "99.99".
DEFINE VARIABLE b AS DECIMAL FORMAT "99.99".
DEFINE VARIABLE c AS DECIMAL FORMAT "99.99".
SET a b c.
RUN pr (a,b,c).
PROCEDURE pr:
DEFINE INPUT PARAMETER a AS DECIMAL.
DEFINE INPUT PARAMETER b AS DECIMAL.
DEFINE INPUT PARAMETER c AS DECIMAL.
DEFINE VARIABLE d AS DECIMAL.
IF a = 0
THEN
DISPLAY "there is only 1 root, it's value " (- c / b).
ELSE
DO:
d = b * b - 4 * a * c .
IF d > 0
THEN
DISPLAY ( - b + SQRT(d) ) / (2 * a) LABEL " 1 root "
( b + SQRT(d) ) / (2 * a) LABEL " 2 root ".
ELSE
DISPLAY "complex roots".
END.
END.
Пример 1.10.2
Программа, определяющая по алгоритму Евклида наибольший общий делитель для пары натуральных чисел.
DEFINE VARIABLE a AS INTEGER.
DEFINE VARIABLE b AS INTEGER.
DEFINE VARIABLE maxdel AS INTEGER.
SET a b.
RUN pd( a, b, OUTPUT maxdel ).
DISPLAY maxdel.
PROCEDURE pd:
DEFINE INPUT PARAMETER a AS INTEGER.
DEFINE INPUT PARAMETER b AS INTEGER.
DEFINE OUTPUT PARAMETER maxdel AS INTEGER.
maxdel = a MODULO b.
IF maxdel = 0
THEN maxdel = b.
ELSE RUN pd ( b, maxdel, OUTPUT maxdel ).
END.
Пример 1.10.3
Программа, вычисляющая факториал натурального числа.
FUNCTION fact RETURNS INTEGER (INPUT n AS INTEGER) FORWARD.
DISPLAY fact(4).
FUNCTION fact RETURNS INTEGER (INPUT n AS INTEGER).
IF n = 0
THEN RETURN(1).
ELSE RETURN(n * fact(n - 1)).
END FUNCTION.
Комментарии к статье:
Добавить комментарий: