CoderNotes - заметки программиста

Публикации  »  4GL
Скидка 65% на Skillbox

Получите скидку 65% на любой курс программирования на популярной образовательной платформе Skillbox!

Подробнее
Бесплатный хостинг + SSL-сертификат

Зарегистрируйте домен и получите 2 месяца бесплатного хостинга и SSL-сертификат на 1 год в подарок

Подробнее

Процедуры и функции в 4GL

Процедуры без параметров. Глобальные переменные.

В языке 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.

 

Категория: 4GL

Комментарии к статье:

Пока комментариев нет, ваш будет первым ;)

Добавить комментарий: