ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 11


		ГЛАВА 6 - Управляющие операторы

Управление Программой....................................... 6-1
     Последовательность Выполнения Операторов............... 6-1
     Вызовы Процедур........................................ 6-1

Управляющие Структуры....................................... 6-2
     CASE (структура условного выполнения).................. 6-2
     EXECUTE (структура выбора оператора)................... 6-4
     IF (структура условного выполнения).................... 6-6
     LOOP (итерационная структура, цикл).................... 6-7

Управляющие операторы....................................... 6-9
     BREAK (немедленный выход из LOOP)...................... 6-9
     CHAIN (выполнить другую программу)..................... 6-10
     CYCLE (перейти в начало цикла)......................... 6-11
     DO (вызвать подпрограмму (ROUTINE)..................... 6-11
     EXIT (покинуть подпрограмму (ROUTINE).................. 6-12
     GOTO (перейти к метке)................................. 6-12
     HALT (выход в DOS)..................................... 6-13
     NOTIFY (обработка критических ошибок).................. 6-14
     RESTART (перезапустить программу)...................... 6-17
     RETURN (вернуться к точке вызова)...................... 6-18
     RUN (выполнить команду ДОС)............................ 6-19
     RUNSMALL (выполнить команду ДОС)....................... 6-20
     SHUTDOWN (определить процедуру завершения)............. 6-21
     STOP (заморозить выполнение программы)................. 6-21


		     УПРАВЛЕНИЕ ПРОГРАММОЙ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
  Последовательность Выполнения Операторов
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН

В разделе CODE Кларионовских программ, операторы выполняются по-
строчно, в той последовательности,  в которой они описаны  в ис-
ходном модуле. Управляющие операторы используются для  изменения
порядка их выполнения.

Управляющие структуры типа IF,  CASE, LOOP и EXECUTE  определяют
порядок выполнения,  вычисляя выражения  и выполняя  операторы в
зависимости от условий. Безусловные переходы имеют место при вы-
зовах процедур и операторах GOTO,DO, CYCLE, BREAK, EXIT, RETURN,
RESTART, CHAIN, RUN и RUNSMALL.

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
  Вызовы процедур
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             procname[(параметры])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

procname           Имя ПРОЦЕДУРЫ, как оно описано  в   прототипе
                   процедуры в  MAP-структуре. Имя  должно соот-
                   ветствовать метке оператора PROCEDURE.

параметры          Необязательный список параметров,  передавае-
                   мый  ПРОЦЕДУРЕ.  Список  может содержать одну
                   или больше меток переменных и/или  выражений.
                   Параметры разделяются запятыми и  описываются
                   в прототипе процедуры в MAP-структуре.

К ПРОЦЕДУРЕ обращаются  по метке (и  в скобках указывают  список
параметров) как к оператору в разделах CODE в PROGRAM, PROCEDURE
или FUNCTION. Список  параметров должен соответствовать  списку,
описанному в прототипе процедуры  в MAP. Процедуры НЕЛЬЗЯ  вызы-
вать в выражениях.

Пример:

     PROGRAM
     MAP
       ComputeTime(*GROUP)      !Передаем группу как параметр
       MatchMaster              !НЕ передаем параметров
     .
ParmGroup    GROUP              !Описываем группу
FieldOne       STRING(10)
FieldTwo       LONG
             .
     CODE
     ComputeTime(ParmGroup)     !Вызываем проц. отсчета времени
     MatchMaster                !Вызываем проц. соответствия

См. также: Прототипы ПРОЦЕДУР и ФУНКЦИЙ

		     УПРАВЛЯЮЩИЕ СТРУКТУРЫ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
CASE                            (структура условного выполнения)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             CASE условие
             OF выражение [TO выражение]
             [OROF выражение ][TO выражение]
               операторы
             [ELSE]
               операторы
             .
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

условие            Числовая или строковая переменная или выраже-
		   ние.

OF                 Операторы, следующие за OF выполняются тогда,
                   когда выражение, следующее за опцией OF, рав-
		   но условию в операторе CASE. В структуре CASE
                   может быть множество опций OF.

выражение          Числовая или строковая переменная или выраже-
		   ние.

TO                 TO позволяет использовать в OF и OROF  не од-
		   но,  а  целый  диапазон  значений. Операторы,
                   следующие  за  OF  или  OROF выполняются если
                   значение условного выражения попадает в  ука-
                   занный диапазон включительно. Выражение, сто-
		   ящее после OF или  OROF - это нижняя  граница
		   диапазона,  а  выражение  после  ТО - верхняя
		   граница.

OROF               Действует полностью аналогично OF. Для  повы-
                   шения  читабельности,  OROF  можно ставить на
                   отдельной строке от OF. С одним OF может быть
                   связано несколько OROF.

ELSE               Операторы, стоящие за ELSE выполняются   если
                   все предыдущие условия  OF и/или OROF  не вы-
                   полнены. ELSE  обычно не  требуется, но  если
                   все же использовано, то должно сбыть  послед-
                   ней опцией в структуре CASE.

statements         Любые разрешенные операторы языка Кларион.

Структура CASE избирательно выполняет операторы, основываясь  на
равенстве между условием и выражением или диапазоном  выражений.
Структуры CASE могут быть вложены в другие управляющие струтуры,
и другие  управляющие структуры  могут быть  вложены в структуры
CASE.

Пример:

  CASE FIELD()             !Выбираем проц. редактирования поля
  OF ?Name                 !Если поле - Имя
    ERASE(?Address,?Zip)   !  стереть Адрес по самый Индекс
    GET(NameFile,NameKey)  !  и считать запись

    CASE Action            !Выбираем Действие
    OF 1                   !  добавить запись - ее еще нет
      IF NOT ERRORCODE()   !  а вдруг ошибка файла?
        ErrMsg = 'ALREADY ON FILE'
                           !    иначе показать сообщ. об ошибке
        DISPLAY(?Address,?Zip)
                           !    показать адрес по самый индекс
        SELECT(?Name)      !    переВВести имя
    .                      !  конец оператора IF
    OF 2 OROF 3            ! изменить/удалить - запись уже есть
     DISPLAY(?Address,?Zip)!   показать адрес по самый индекс
    .                      !   end case action

    CASE SUB(Name,l,l)     !Get first letter of name
    OF 'A' TO 'M'          !Process first half of alphabet
    OROF 'a' TO 'm'
      DO FirstHalf
    OF 'N' TO 'Z' OROF 'n' TO 'z' DO SecondHalf
                           !Process second half of alphabet
    .                      !End case sub(name
  OF ?Address              !If field is address
    DO AddressVal          !  call validation routine
  .                        !End case fieldo

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
EXECUTE                          (statement selection structure)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
       EXECUTE expression
         statement 1
         statement 2
         [BEGIN
           statements
         .]
         statement n
       .
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

expression         Числовое выражение, или переменная,  содержа-
                   щая численное значение.

statement 1        Одиночный оператор, выполняемый только,  если
                   expression=1.

statement 2        Одиночный оператор, выполняемый только,  если
                   expression=2.

BEGIN              BEGIN отмечает  начало структуры,  содержащей
                   одну или больше  строк кода. Структура  BEGIN
		   рассматривается  как  одиночный  оператор   в
                   структуре EXECUTE. Структура BEGIN завершает-
                   ся точкой или оператором END.

statement n        Одиночный оператор, выполняемый только,  если
                   expression=n.

Структура EXECUTE выбирает  одиночный исполняемый оператор  (или
их набор в виде структуры) на основании значения expression. Ес-
ли expression равно 1, выпоняется первый оператор (statement 1).
Если expression  равно 2,  то второй  (statement 2)  и т.д. Если
значение expression - ноль или больше, чем общее число  операто-
ров и/или структур внутри структуры EXECUTE, то EXECUTE  игнори-
руется.

Струтуры EXECUTE могут быть вложены в другие исполняемые  струк-
туры и другие исполняемые  структуры (IF, CASE, LOOP,  EXECUTE и
BEGIN) могут быть вложены в EXECUTE.

Пример:

   EXECUTE   Transact     !Evaluate Transact
     ADD(Customer)        !Execute if Transact = 1
     PUT(Customer)        !Execute if Transact = 2
     DELETE(Customer)     !Execute if Transact = 3
   .                      !End execute

   EXECUTE CHOICEO        !Evaluate CHOICEO function
     OrderPart            !Execute if CHOICEO = 1
     BEGIN                !Execute if CHOICEO = 2
       SavVendor" = Vendor
       UpdVendor
       IF  Vendor <> SavVendor"
         Mem:Message = 'VENDOR NAME CHANGED'
     . .
     CASE VendorType      !Execute if CHOICE() = 3
     OF 1
       UpdPartNo1
     OF 2
       UpdPartNo2
     .
     RETURN               !Execute if CHOICEO - 4
   .                      !End execute

См. также: BEGIN

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
IF                              (структура условного выполнения)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
          IF логическое выражение
          [THEN]
            satements
          [ELSIF логическое выражение]
          [THEN]
            satements
          [ELSE]
            satements
          .
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

логическое         Числовая или строковая переменная,  выражение
выражение          или функция. ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ   вычисляет
                   условие. Передача управления определяется ре-
                   зультатом (true или false) выражения. Нулевое
                   (или пустое) значение считается ЛОЖЬЮ,  любое
                   другое значение - ИСТИНА.

THEN               Операторы после THEN выполняются, если преды-
                   дущее ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ вычислено как  ИС-
		   ТИНА. THEN  НАДО пропускать,  если подлежащие
                   выполнению операторы  находятся на  отдельной
                   строке, а не не той же, где и ЛОГИЧЕСКОЕ  ВЫ-
                   РАЖЕНИЕ.

statements         Выполняемый оператор или   последовательность
                   выполняемых операторов.

ELSIF              ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ, стоящее за ELSIF вычис-
                   сляется только если все предыдущие IF и ELSIF
                   были ЛОЖЬю.

ELSE               Операторы, стоящие за ELSE выполняются,  если
                   все предыдущие IF и ELSIF дают ЛОЖЬ. ELSE  НЕ
                   требуется,  но  если  используется, то должно
                   быть последней опцией в операторе IF.

Структура IF управляет выполнением программы на основании  выво-
дов из одного или более ЛОГИЧЕСКИХ ВЫРАЖЕНИЙ. Структуры IF могут
иметь любое количество групп операторов ELSIF-THEN. Структуры IF
могут быть  "вложены" в  другие управляющие  структуры, и другие
управляющие структуры могут быть вложены в IF-структуры.

Пример:

   IF Cus:TransCount        !If new customer
     AcctSetup              !  call account setup procedure
   ELSIF Cus:TransCount > 10 AND Cus:TransCount < 100
                            !If regular customer
     DO RegularAcct         !  process the account
   ELSIF Cus:TransCount>100 !If special customer
     DO SpecialAcct         !  process the account
   ELSE                     !Otherwise
     DO NewAcct             !  process the account
     IF Cus:Credit THEN CheckCredit ELSE CLEAR(Cus:CreditStat).
                            !  verify credit status
   .                        !End if
   IF ERRORCODEO THEN ErrHandler(Cus:AcctNumber,Trn:InvoiceNbr).
                            !Handle errors

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
LOOP                              (итерационная структура, цикл)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             і        сколько TIMES        і
       LOOP [і i=начало TO конец [BY шаг]  і]
             і  UNTIL логическое выражение і
             і  WHILE логическое выражение і
         statements
       .
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

сколько            Числовая константа, переменная или выражение,
                   которое определяет, СКОЛЬКО раз (TIMES) будут
                   повторены операторы в цикле LOOP.

TIMES              Опция TIMES (раз) выполняет операторы столько
                   раз, СКОЛЬКО задано.

i                  Метка переменной-счетчика цикла.

=                  Присвоить переменной (i) новое значение   при
                   каждой итерации цикла LOOP.

начало             Числовая константа, переменная или выражение,
                   которое задает начальное значение для счетчи-
                   ка цикла (i) при первом проходе через  струк-
                   туру LOOP.

TO                 Синтаксическая связка для параметра КОНЕЦ.

конец              Если i больше чем КОНЕЦ, то выполнение  цикла
                   LOOP завершается.

BY                 Синтаксическая связка для параметра ШАГ.

шаг                Числовая константа, переменная или выражение.
		   ШАГ  определяет  величину,  на  которую будет
		   увеличиваться i при каждом проходе цикла. Ес-
		   ли параметр BY опущен, то по умолчанию подра-
		   зумевается, что i увеличивается на 1.

UNTIL              Параметр UNTIL вычисляет ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ
                   ПЕРЕД очередным проходом цикла. Если ЛОГИЧЕС-
                   КОЕ ВЫРАЖЕНИЕ вычислено как ИСТИНА, то выпол-
                   нение цикла LOOP завершается.

WHILE              Параметр WHILE вычисляет ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ
                   ПЕРЕД очередным проходом цикла. Если ЛОГИЧЕС-
                   КОЕ ВЫРАЖЕНИЕ вычислено как ЛОЖЬ, то выполне-
                   ние цикла LOOP завершается.

логическое         Числовая или строковая переменная,  выражение
выражение          или функция. ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ   вычисляет
                   условие. Передача  управления зависит  от ре-
                   зультата (ИСТИНА или ЛОЖЬ) выражения. Нулевое
                   (или пустое)  значение является  ЛОЖЬю, любое
                   другое значение - ИСТИНА.

Структура LOOP повторяет выполнение операторов внутри структуры.
Условия для LOOP всегда вычисляются в начале цикла, перед каждым
проходом. Структуры LOOP могут быть вложены вдругие  исполняемые
структуры, и другие исполняемые  структуры могут быть вложены  в
структуры LOOP.

LOOP без параметров выполняется бесконечно, до тех пор, пока  не
выполнится оператор BREAK или RETURN. BREAK прекращает цикл LOOP
и продолжает выполнение программы с оператора, идущего за струк-
турой LOOP. Все операторы в структуре LOOP исполняютс до  опера-
тора CYCLE. CYCLE немедленно передает управление на начало цикла
LOOP для следующего прохода,  не исполняя операторов, стоящих  в
LOOP после CYCLE.

Пример:

    LOOP                      !Бесконецный цикл
      Char = GetChar()        !  получить символ
      IF Char <> CarrReturn   !  если это не возврат каретки
        Field = CLIP(Field) & Char
                              !  то добавить его к строке
      ELSE                    !  иначе
        BREAK                 !    завершить цикл
    . .                       !Конец операторов IF и LOOP

    IF ERRORCODE()            !При ошибке
      LOOP 3 TIMES            !  повторить три раза
        BEEP                  !    звуковой ситнал тревоги
    . .                       !Конец операторов LOOP и IF

    LOOP I# = 1 TO 365 BY 7   !В цикле I# увеличивается на 7
    			      !каждый раз
      GET(DailyTotal,l#)      !  читаем каждую 7-ю запись
      DO WeeklyJob            !  выполняем подпрограмму
    .                         !Конец цикла

    SET(MasterFile)           !Указатель - на первую запись
    LOOP UNTIL EOF(MasterFile)!Обрабатываем все записи
      NEXT(MasterFile)        !  читаем запись
      ProcMaster              !  вызываем процедуру
    .                         !Конец цикла

    LOOP WHILE KEYBOARD()     !Опустошаем буфер клавиатуры
      ASK                     !  не обрабатывая нажатия клавиш
    .                         !Конец цикла

См. также: BREAK, CYCLE

		     УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
BREAK                                 (немедленно выйти из LOOP)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             BREAK
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Оператор BREAK немедленно прекращает выполнение цикла LOOP и пе-
редает управление  первому оператору,  следующему за  структурой
LOOPe. BREAK может использоваться только в LOOP-структурах.

Пример:

  SHOW(5,12,'Press ESC to Continue')   !Покажем сообщение
  LOOP                                 !Начало цикла LOOP
    ASK                                !  ждем нажатия клавиши
    IF KEYCODE()= 256                  !  если нажата ESC, то
      BREAK                            !    вылетаем из цикла
    ELSE                               !  иначе,
      BEEP                             !    даем гудок
  . .                                  !Конец оп-ров IF и LOOP

См. также: LOOP, CYCLE

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
CHAIN                               (выполнить другую программу)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             CHAIN(программа)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

программа          Строковая константа или переменная,  содержа-
                   щая имя программы  для исполнения. Это  может
                   быть любая EXE или COM программа.

CHAIN завершает текущую программу, закрывает все файлы,  возвра-
щает всю  запрошенную память  операционной системе,  и выполняет
другую ПРОГРАММУ.

Пример:

    PROGRAM                !Код программы MainMenu
    CODE
    EXECUTE CHOICE()
      CHAIN('Ledger')      !Выполнить LEDGER.EXE (книга счетов)
      CHAIN('Payroll')     !Выполнить PAYROLL.EXE (платежная
			   !  ведомость)
      RETURN               !Вернуться в DOS
    .

    PROGRAM                !Код программы Книга Счетов
    CODE
    EXECUTE CHOICE()
      CHAIN('MainMenu')    !Возврат в программу MainMenu
      RETURN               !Возврат в DOS
    .

    PROGRAM                !Код программы Платежная Ведомость
    CODE
    EXECUTE CHOICE()
      CHAIN('MainMenu')    !Возврат в программу MainMenu
      RETURN               !Возврат в DOS
   .

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
CYCLE                              (перейти в начало цикла LOOP)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             CYCLE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Оператор CYCLE, немедленно передает управление нназад, на начало
цикла LOOP, в то место, где вычисляется условие для LOOP.  CYCLE
может испоьзоваться ТОЛЬКО с LOOP-структурами.

Пример:

   SET(MasterFile)             !Указатель - на первую запись
   LOOP UNTIL EOF(MasterFile)  !Обрабатываем все записи
     NEXT(MasterFile)          !  читаем запись
     DO MatchMaster            !  проверка на совпадение
     IF NoMatch                !  если не совпадает, то
       CYCLE                   !    идем на начало loop
     .                         !  конец оператора IF
     DO TransVal               !  подтвердить транзакцию
     PUT(MasterFile)           !  записать запись
   .                           !Конец цикла

См. также: LOOP, BREAK

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
DO                               (вызвать подпрограмму (ROUTINE)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             DO метка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

метка              Метка оператора ROUTINE.

Оператор DO используется  для выполнения подпрограммы  (ROUTINE)
локальной для ПРГРАММЫ,  ПРОЦЕДУРЫ или ФУНКЦИИ.  Если выполнение
ROUTINE завершено, то управление передается оператору, следующе-
му за DO. ROUTINE может быть вызвана только из той секции  CODE,
которая содержит эту ROUTINE.

Пример:

   DO NextRecord                  !Call the next record routine
   DO CalcNetPay                  !Call the calc net pay routine



ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
EXIT                            (выйти из подпрограммы (ROUTINE)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             EXIT
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Оператор EXIT немедленно покидает ROUTINE и передает управление
оператору, следующему за оператором DO, который вызвал эту под-
программу. Оператор EXIT не требуется. ROUTINE без EXIT заверша-
ется автоматиески, когда завершается последовательность операто-
ров в ROUTINE.

Пример:

CaIcNetPay      ROUTINE
     IF GrossPay = 0        !Если нет платежа
       EXIT                 !  выйти из подпрограммы
     .
     NetPay = GrossPay - FedTax - Fica
     QtdNetPay += NetPay
     YtdNetPay += NetPay

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
GOTO                                           (перейти к метке)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             GOTO метка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

метка              МЕТКА другого исполняемого оператора в  ПРОГ-
                   РАММЕ,   ПРОЦЕДУРЕ,   ФУНКЦИИ   или    РУТИНЕ
		   (ROUTINE).

Оператор GOTO передает  управление от одного  оператора другому.
МЕТКА-параметр GOTO НЕ должна быть меткой РУТИНЫ, ПРОЦЕДУРЫ  или
ФУНКЦИИ.

Диапазон  GOTO-переходов  ограничен  текущей РУТИНОЙ, ПРОЦЕДУРОЙ
или ФУНКЦИЕЙ; GOTO НЕ  может передать управление ЗА  ПРЕДЕЛЫ РУ-
ТИНЫ, ПРОЦЕДУРЫ или ФУНКЦИИ в которой он использован.

Пример:

ComputeIt     FUNCTION(Level)
              CODE
              IF Level = 0 THEN GOTO PassCompute.
                             !Пропустить вычисление процентов,
			     !если не задана процентная ставка
              Rate = Level * MarkUp !Вычислить проценты
              RETURN(Rate)          !  и вернуть их
PassCompute   RETURN(999999)        !Return bogus number

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
HALT                                               (выход в DOS)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             HALT(errorlevel,[сообщение])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

errorlevel         Позитивная  целая константа или переменная  в
                   диапазоне 0..250, которая представляет  собой
                   код  выхода,  передаваемый  в  DOS.  DOS-флаг
		   ERRORLEVEL будет установлен в это значение.

сообщение          Строковая  константа или переменная,  которая
                   выводится на экран после завершения программы

Оператор HALT немедленно возвращает управление DOS, устанавливая
ERRORLEVEL и, необязательно, показывая СООБЩЕНИЕ после  заверше-
ния программы. Если взведена SHUTDOWN-процедура, то она выполня-
ется перед завершением программы.

Если программа, остановленная  HALT-ом была запущена  оператором
RUN или RUNSMALL из  другой Кларион-программы, то ERRORLEVEL,  с
которым вышла остановленная  программа, можно получить  функцией
RUNCODE.

Пример:

Password        STRING(10)
                CODE
                BLANK
                SHOW(1,1,'Введите, пожалуйста, пароль.')
                Password = ENTRY(2,3,@S10)
                IF Password <> 'Pay$MeMoRe'
                  HALT(0,'А вот хрен тебе! Неправильно.')
                .

См. также: SHUTDOWN, RUN, RUNSMALL, RUNCODE

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
NOTIFY                            (обработка критических ошибок)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             NOTIFY(процедура,событие)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

процедура          Метка  ПРОЦЕДУРЫ, прототип которой,    должен
                   быть объявлен в MAP, как получающий  *STRING-
                   параметр (STRING передается по адресу).

событие            Целочисленная константа, переменная или выра-
                   жение. Если ноль, то процедура NOTIFY отменя-
		   ется; если  один, то  критические ошибки  DOS
		   обрабатываются процедурой.

Оператор NOTIFY "взводит" (SPA. А как еще перевести слово arms?)
процедуру для  обработки критических  ошибок ДОС.  Эта процедура
получает параметр  типа *STRING,  на адрес  которого, передается
управление при возникновении критической ошибки.

Назначение этой ПРОЦЕДУРЫ - позволить Clarion-приложениям  обра-
батыать критические ошибки.  ПРОЦЕДУРА может выполнять  дисковые
операции или  любые другие  действия. Выход  из ПРОЦЕДУРЫ должен
осуществляться оператором RETURN, (RESTART крайне не  рекоменду-
ется) и процедура должна выбирать и анализировать значение,  ко-
торое DOS определяет для конкретной ошибки

STRING-параметр, передаваемый  по адесу  в процедуру  может быть
изначально назначен GROUP, для подавления необходимости  синтак-
сического  разбора  строки  для  получения информации об ошибке.
GROUP может быть  описана как глобально  (Глобальные Статические
Данные) так  и локально  по отношению  к модулю-ЧЛЕНУ (Локальные
Статические Данные) для уменьшения потребностей в выделении  па-
мяти на стеке. GROUP может быть описана со следующими полями:

CritParmGroup GROUP,PRE(Crt) !Описание параметра-группы
Status          LONG   !Состояние обработки, 1 для критич.ошиб.
CritType        SHORT        !Код критической ошибки, 1-12, 15
CritMsg         STRING(25)   !Описание критической ошибки
CritDev         STRING(25)   !Имя устройства на котором ошибка
RetVal          STRING(1) !Возвращаемое значение - A, I, R или F
              .

Критические ошибки ДОС, которые могут быть обработаны ПРОЦЕДУРОЙ
          CritType             CritMsg
        ДДДДДДДДДДДДДДД      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
             0                Защита от записи
             1                Неверный номер диска
             2                Диск(овод) не готов
             3                Затребована неизвестная команда
             4                Ошибка контрольной суммы (CRC)
             5                Неверная длина структуры-запроса
             6                Ошибка поиска
             7                Незвестный формат диска
             8                Сектор не найден
             9                В бумаге кончился принтер :-) :-)
             10               Сбой при записи
             11               Сбой при чтении
             12               Общая, неспецифичная ошибка
             15               Неверная смена диска (?)

После присвоения  переданного параметра  STRING ГРУППЕ  (GROUP),
процедура может определить, какая ошибка произошла, из  значений
CritType  (номер  ошибки),  CritMsg  (описание ошибки) и CritDev
(отказавшее устройство). Затем, она может определить, какую  оп-
цию  выбрать  для  конкретной  ошибки  и присвоить ее переменной
RetVal.

Разрешеннные значения для RetVal:

  I        Ignore (игнорировать ошибку)
  R        Retry (повторить действие, приведшее к ошибке)
  A        Abort (отменить действие, приведшее к ошибке)
  F        Fail (прекратить выполнение и выйти в ДОС)

Значение RetVal в конце процедуры определяет, как ошибка обрабо-
тана. Выбранная опция возвращается присвоением ГРУППЫ переданно-
му параметру *STRING в конце процедуры.

Пример:

    Этот примерный код содержит два примера обработчиков  крити-
    ческих ошибок. PrinterReady специфична для ошибок  принтера,
    а ErrorProc - обработчик прочих ошибок.

        PROGRAM
        MAP
          PrintReport           !Процедура печати
          PrinterReady(*STRING) !Обработчик ошибок принтера
          ErrorProc(*STRING)    !Обработчик остальных ошибок
        .
CritParmGroup GROUP,PRE(Crt)    !Описание группы параметров
Status          LONG            !Processing status, always 1
CritType        SHORT           !Critical error code, 1-12, 15
CritMsg         STRING(25)      !Critical error description
CritDev         STRING(25)      !Error device name string
RetVal          STRING(L)       !Action option chosen-A,I,R,or F
              .
ErrFlag       BYTE(0)           !Флаг присутствия ошибки
        CODE
        PrintReport             !Вызов процедуры-отчета
        NOTIFY(ErrorProc,1)     !Взводим обработчик общих оши-
				!  бок
                    !Здесь находится какой-то исполняемый код

PrintReport   PROCEDURE
                    !Здесь описываем формат отчета

ErrScreen  SCREEN(15,56),PRE(Scr),CQLOR(73),CENTER,SHADOW,CUA
             ROW(1,1) STRING('ЙН{54}»')
             ROW(2,1) REPEAT(13);STRING('єє')
             ROW(15,1) STRING('ИН{54}ј')
             ROW(3,16) STRING('Ошибка -- Проверь принтер!')
             ROW(13,16) STRING('Ошибка -- Проверь Принтер!')
           .
        CODE
        NOTIFY(PrinterReady,1)  !Взводим обработчик ошибок
				!  принтера
        PRINT('<27>')           !Посылаем ESC на принтер
        IF ErrFlag              !Была ли критическая ошибка?
          OPEN(ErrScreen)       !  вывести экран с предупрежд.
          ASK                   !  ждем нажатия на клавишу
          ErrFlag = 0           !  сбрасываем флаг ошибки
          RETURN                !  и вываливаемся
        .
                    !Здесь остальной код отчета

PrinterReady PROCEDURE(ParmString)!Обработчик ошибок принтера
        CODE
     ErrFlag = 1                !Была критическая ошибка!
     CritParmGroup = ParmString !Какя именно?
     Crt:RetVal = 'F'           !Отказ от продолжения
     ParmString = CritParmGroup !Вернуть данные в параметр



ErrorProc PROCEDURE(ParmString) !Обработчик общих ошибок
Opt       STRING(1)             !Размещается на стеке

ErrScreen  SCREEN(3,40),PRE(Scr),COLOR(79),CENTER,CUA
             ROW(1,2) STRING('Ошибка:')
ErrDesc      ROW(1,10) STRING(25)
ErrDevice    ROW(2,10) STRING(25)
             ROW(3,2) STRING('Выбери: Abort Retry Ignore Fail')

        CODE
    CritParmGroup=ParmString    !Получить данные об ошибке
    OPEN(ErrScreen)             !Открыть экран
    Scr:ErrDesc = Crt:CritMsg   !Получить описание ошибки
    Scr:ErrDevice = Crt:CritDev !  и устройстве
    LOOP                        !Цикл для ввода допустимого
				!  выбора
      ASK                       !Ждем ввода с клавиатуры
      Opt = UPPER(KEYCODE())
      IF Opt <> 'A' AND Opt <> 'R' AND Opt <> 'I' AND Opt <> 'F'
                                !Если выбранная опция недопус-
				!  тима, то
        BEEP                    !  предупреждаем пользователя
        CYCLE                   !  и повторяем ввод
      ELSE                      !Иначе,
        BREAK                   !  продолжаем
    . .                         !Конец операторов IF и LOOP
    Crt:RetVal = Opt            !Помещаем опцию, выбранную поль-
    				!  зователем в CritParmGroup
    ParmString = CritParmGroup  !Вернуть данные в параметр

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RESTART                                (перезапустить программу)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RESTART([процедура])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

процедура          Метка   оператора PROCEDURE. Если   ПРОЦЕДУРА
                   опущена, то рестарт с начала ПРОГРАММЫ.

Оператор RESTART завершает выполнение текущей ПРОГРАММЫ,  ПРОЦЕ-
ДУРЫ или ФУНКЦИИ и начинает выполнение программы из точки, опре-
деленной параметром ПРОЦЕДУРА. ПРОЦЕДУРА, выполняемая оператором
RESTART рассматривается как "вызываемая из ДОС". Таким  образом,
RETURN из ПРОЦЕДУРЫ-параметра  RESTART завершает выпонение  ПРО-
ГРАММЫ. RESTART НЕ перезагружает ПРОГРАММУ в память и не сбрасы-
вает переменные в их начальные значения. В RESTART-ПРОЦЕДУРУ не-
льзя передать параметры.

Пример:

   RESTART                   !Рестарт с самого начала

   RESTART(QuitToDOS)        !Выход в ДОС

QuitToDOS   PROCEDURE        !У этой процедуры только одно
			     !  предназначение:
            CODE
            RETURN           !  ВЫХОД В ДОС

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RETURN                                (вернуться в точку вызова)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RETURN([выражение])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

выражение          ВЫРАЖЕНИЕ передает возвращаемое  значение  из
                   ФУНКЦИИ в выражение, в котором использовалась
                   эта ФУНКЦИЯ. ВЫРАЖЕНИЕ требуется для ФУНКЦИИ,
                   и НЕ может быть использовано в ПРОГРАММЕ  или
                   ПРОЦЕДУРЕ.

Оператор RETURN завершает ПРОГРАММУ, ПРОЦЕДУРУ или ФУНКЦИЮ и пе-
редает управление назад  в точку вызова.  Если RETURN вызван  из
секции CODE в ПРОГРАММЕ, то программа завершается, все файлы за-
крываются и управление возвращается операционной системе.

RETURN требуется для ФУНКЦИИ  и НЕ обязателен для  ПРОЦЕДУРЫ или
ПРОГРАММЫ. Если RETURN не используется в ПРОЦЕДУРЕ или  ПРОГРАМ-
МЕ, то в конце исполняемого кода выполняется неявный RETURN. Ко-
нец исполняемого  кода определяется  концом исходного  файла или
началом другой ПРОЦЕДУРЫ, ФУНКЦИИ или РУТИНЫ.

Пример:

    IF Done# THEN RETURN. !Выход, если все сделано

DayOfWeek FUNCTION(Date)  !Функция возвращает день недели
   CODE
   EXECUTE (Date % 7) + 1 !Определяем, каким днем будет Date
     RETURN('Sunday')     !  и ВОЗВРАЩАЕМ название этого дня
     RETURN('Monday')     !  через RETURN
     RETURN('Tuesday')
     RETURN('Wednesday')
     RETURN('Thursday')
     RETURN('Friday')
     RETURN('Saturday')
   .

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RUN                                      (выполнить команду ДОС)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RUN(команда)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

команда            Строковая константа или переменная,  содержа-
                   щая команду.

Оператор RUN выполняет  комаду, как если  бы она была  введена в
командной строке ДОС. По исполнении КОМАНДЫ, управление  переда-
ется оператору, следующему за оператором RUN.

RUN закрывает все файлы, сохраняет экран и записывает образ  па-
мяти программы во временный  ДОС-файл с расширением .RUN.  Таким
путем получаются уникальные имена файлов для множества временных
.RUN-файлов. Временный  файл пишется  на текущий  диск в текущий
каталог, если переменная  окружения 'CLATMP='не указана.  CLATMP
задает диск и каталог для всех временных файлов Кларион. Это мо-
жет быть  RAM-диск (рекомендуется  не менее  512К). Команда  ДОС
SET CLATMP=D:\  задает корневой каталог диска D: как каталог для
временных файлов.

RUN НЕ загружает автоматически вторую копию COMMAND.COM.  Поэто-
му, КОМАНДА должна вызывать его если надо. COMMAND.COM нужен для
внутренних команд ДОС, BAT-файлов или комад, которые должны  ис-
кать программы по PATH. Если программа КОМАНДА находится в теку-
щем каталоге, или  путь к ней  указан в КОМАНДЕ,  то нет никакой
необходимости во  второй копии  COMMAND.COM. Тем  не менее,  без
COMMAND.COM, КОМАНДА должна включать так же расширение программ-
ного файла (.EXE или .COM).

По исполнении КОМАНДЫ, временный файл перезагружается в память и
выпонение программы продолжается с оператора, следующего за опе-
ратором RUN. После восстановления программы в памяти, все  файлы
переоткрываются в том же режиме доступа, в котором они были  от-
крыты до RUN, так же, восстанавливается сохраненный экран.  Вре-
менный файл должен быть перезагружен в то же самое место в памя-
ти, из которого он выгружался, то есть, использовать RUN для за-
грузки резидентов  (TSR) НЕ  разрешено. Поскольку  RUN закрывает
все файлы а затем переоткрывает их, то текущие указатели на  за-
писи теряются. Следовательно, выполнение оператора RUN во  время
доступа к файлам, крайне не рекомендуется.

Успешность  выполнения  КОМАНДЫ  может  быть  проверена функцией
RUNCODE, которая возвращает код  выхода DOS, с которым  заверши-
лась КОМАНДА. Если выполнение неудачно, RUN передает код  ошибки
в функции ERROR и ERRORCODE.

Передаваемые ошибки:

    RUN может передать любую возможную ошибку (см. приложение B)

Пример:

   RUN('\command.com /c dir /p') !Выполним команду DIR с паузой
                                 !  между страницами
   RUN('c:\wp5l\wp.exe')         !Запустим WordPerfect
   RUN(ProgName)                 !Выполним команду, содержащую-
                                 !  ся в переменной ProgName


См. также: RUNCODE


ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RUNSMALL                                     (выполнить команду)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RUNSMALL(команда)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

команда            Аналогично КОМАНДЕ для RUN.

Оператор RUNSMALL выполняет команду ДОС в ДОСТУПНОЙ памяти.  КО-
МАНДА выполняется как если бы она была введена в командной стро-
ке  ДОС,  затем  управление  возвращается в программe оператору,
следующему за RUNSMALL.

RUNSMALL закрывает все файлы, сохраняет экран и выполняет КОМАН-
ДУ. По выполнении  КОМАНДЫ, все файлы  переоткрываются в том  же
режиме доступа,  что и  до RUNSMALL,  экран восстанавливается  и
программа продолжается с оператора, следующего за RUNSMALL.  Ис-
пользование RUNSMALL для загрузки резидентов (TSR) НЕ рекоменду-
ется. Поскольку  RUN  закрывает все файлы а  затем переоткрывает
их, то текущие указатели на записи теряются. Следовательно,  вы-
полнение оператора  RUN во   время доступа  к файлам,  крайне не
рекомендуется.

RUNSMALL НЕ  загружает автоматически  вторую копию  COMMAND.COM.
Поэтому, КОМАНДА должна вызывать его если надо. COMMAND.COM  ну-
жен для  внутренних команд  ДОС, BAT-файлов  или комад,  которые
должны искать программы по PATH. Если программа КОМАНДА находит-
ся в текущем каталоге, или путь  к ней указан в КОМАНДЕ, то  нет
никакой необходимости во второй копии COMMAND.COM. Тем не менее,
без COMMAND.COM, КОМАНДА должна включать так же расширение  про-
граммного файла (.EXE или .COM).

Успешность  выполнения  КОМАНДЫ  может  быть  проверена функцией
RUNCODE, которая возвращает код  выхода DOS, с которым  заверши-
лась КОМАНДА.  Если выполнение  неудачно, RUNSMALL  передает код
ошибки в функции ERROR и ERRORCODE.

Передаваемые ошибки:

RUNSMALL может передать любую возможную ошибку (см.приложение B)

Пример:

 RUNSMALL('\command.com /c dir /p')!Выполняем ДОС-команду DIR
 RUNSMALL(PrgoName)    !Выполняем команду из переменной ProgName

См. также: RUNCODE

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
SHUTDOWN                          (взвести процедуру завершения)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             SHUTDOWN([процедура])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

процедура          Метка оператора PROCEDURE.  Если опущена,  то
                   SHUTDOWN-процесс отменяется.

Оператор SHUTDOWN взводит  ПРОЦЕДУРУ, вызываемую при  завершении
программы. ПРОЦЕДУРА вызывается  при нормальном завершении  про-
граммы, нажатии Ctrl-Break или при НЕнормальном завершении/оста-
нове-во-время-исполнения. Она не вызывается, если компьютер  пе-
резагружается  или  программа  прервана  из-за  сбоя по питанию.
RESTART в SHUTDOWN-ПРОЦЕДУРЕ НЕ рекомендуется.

Пример:
    SHUTDOWN(CloseSys)               !Arm the shutdown procedure

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
STOP                           (заморозить выполнение программы)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             STOP([сообщение])
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

сообщение          Необязательное  строковое выражение (до 64K),
                   которое будет показано в информационном окне.

STOP замораживает выпонение программы и показывает  информацион-
ное окно. STOP предлагает пользователю выбор - продолжить выпол-
нение программы или выйти в DOS. При выходе в DOS, STOP закрыва-
ет все файлы и освобождает выделенную программе память. Информа-
ционное окно также содержит информацию системного уровня,  показ
которой можно  отменить только  установкой переменной  окружения
CLASTOP в OFF. Синтаксис CLASTOP:

          CLASTOP=1085,OFF

Число означает Кларионовский код клавиши (1085 = ALT=), который
вызывает информационное окно STOP когда операторы ACCEPT или ASK
ждут ввода с клавиатуры. CLASTOP может быть установлена на уров-
не DOS, в файле конфигурации программы или же в командной стро-
ке. Если значение не OFF, то при появлении информационного окна,
будет доступна информация системного уровня.

Пример:

PswdScreen  SCREEN(3,30)
              ROW(1,1) STRING(' А ну-ка, введи Пароль!')
              ROW(2,2) ENTRY(@10),USE(Password),HIDE
           .                         !Поле для хранения пароля
     CODE
     OPEN(PswdScreen)            !Открыть экран пароля
     ACCEPT                      !  и считать ответ пользователя
     IF Password <> 'PayMe$moRe' !Правильный пароль?

     LOOP;STOP('А вот хрен тебе! Доступ запрещен!').
     .                           !Если нет, то идут они все...


Яндекс цитирования