<<< BACK NEXT >>>

ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ И МЕСТ, ОБЛАСТИ ВИДИМОСТИ

   Все переменные CAPER традиционно различаются по
   - области видимости;
   - времени создания;
   - способу инициализации;
   - возможности удаления.

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

   PUBLIC <список переменных с инициализацией>

<список переменных с инициализацией> - это

<дескриптор переменной>[:= <выражение>] {[ , <дескриптор переменной>
   [ :=<выражение>]]}

public var1 := 10’B,  var2,  var3 :=  array(  'C' , 0, 100, 200 )

   Public-переменные статичны по своему характеру - память под переменные выделяется момент старта виртуальной машины и существует до конца ее работы. В момент определения в общем хранилище фиксируется факт создания переменной с заданным именем. Public-переменная может быть удалена, что реализуется удалением регистрации переменной с данным именем из хранилища.Public-переменная может быть определена в любом месте любого блока или
модуля. Возможность повторного определения допускается, если не установлено противное. Если повторное определение запрещено, в момент такой попытки вырабатывается внутреннее прерывание машины языка, позволяющее прикладной
программе обработать данную ситуацию. Приватные переменные видны только  в пределах  одного модуля  и задаются
аналогичными Public конструкциями:

   PRIVATE  <список переменных с инициализацией>
   DEFINE  <список переменных с инициализацией>

Приватные переменные, определенные в блоке, видны только в данном блоке и его подблоках. Private-переменные статичны по своему характеру: память им выделяется  внутри модуля. Переменные данного типа становятся "живыми" в
момент загрузки модуля в оперативную память. Соответственно, удаление переменных происходит в момент удаления всего модуля.Удаление отдельной переменной не допускается.

private  pVar1 :=0, pVar2 :=1
 .   .   .
pVar1 += pVar2 *10

block BL1( Par1, Par2 )
  private  p1Var1 :=0, p1Var2 :=1, pVar1 := 2, pVar2
      .   .   .
  pVar1  -= p1Var2                 ;* Здесь произошла локализация pVar1
                                   ;* (определение, сделанное выше, не
    .   .   .                      ;* действует значение равно 1
    .   .   .                      ;* ( pVar1 := pVar1 - p1Var2 )
  block BL2( Par1, Par2 )
    private  p2Var1 :=0, p2Var2 :=1
    .   .   .
    p2Var2 := (  pVar2 :=100 )
  endblock
  p1Var1 := pVar2 / 10             ;* в pVar2  - значение 100, полученное в BL2
      .   .   .
endblock
pVar2 := 1 - pVar2                 ;* здесь используется первое определение

Define-переменные формируются в момент выполнения одного из блоков модуля, в котором присутствует оператор DEFINE. DEFINE в модуле позволяет, фактически, создавать их реентерабельными, т.е. одни и те же блоки модуля могут быть вызваны разными параллельными ветвями вычислений. Для каждой ветви создается и используется собственный пул приватных переменных. Локальные переменные видны только внутри одного блока (но не в подблоках!).

   LOCAL <список переменных с инициализацией>

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

Пример:

/*  Инициализация   arr1   3-х мерным  массивом , двухбайтные элементы которого
    заполняются числом 25
*/

  PUBLIC  arr1 := array(  'H', 25 ,  3, 4, 5 )

  BLOCK   block1(pVar1, pVar2)
       .  .  .
/*  var2  инициализируется  регионом - частью  массива  arr1   */

    private   var1, var2 := Region( arr1, null,  2, 2, 1, 2, 3, 4)
    local  LVar1 := 0, Lvar2 := 100'H
             .  .  .

    BLOCK block1(pVar1, pVar2)
      private  LVar1 := 0, a2 := "Строковый литерал CAPER"
      .  .  .
      Lvar1 := - a[2] ; * Здесь действует Lvar1, определенный внутри
                        * блока
      arr1[ 1, 2, 1 ] :=  a2[ 4 ] ;* код четвертого символа строкового       =>
                                     литерала будет присвоен двухбайтовому   =>
                                     элементу массива
    ENDBLOCK

    Lvar2[ 1, 2, 2 ] := a2[ 3 ] ; * вызовет сообщение компилятора об ошибке, =>
                                    ибо a2 не видна на этом уровне
        .  .  .
  ENDBLOCK

PUBLIC-переменные могут быть удалены оператором DELETE (см. далее).
PUBLIC-переменные, предваряемые спецификатором

INIT PUBLIC <список переменных с инициализацией>

запрещают повторную инициализацию переменной. Аналогично INIT действует на PRIVATE-переменные:

init private var:=0

осуществит инициализацию в момент первого выполнения, в последующие проходы присвоение игнорируется.

   Язык CAPER позволяет написание реентерабельных программ, т.е. программ(блоков команд), которые могут быть вызваны в разные моменты времени несколькими параллельно исполняющимися блоками. С целью формирования уникального для каждого вызова поля локальных переменных необходимо использовать оператор

  LOCAL <список переменных с инициализацией>

а для PRIVATE переменных - оператор

  DEFINE <список переменных с инициализацией>

   Как и ранее, к локальным переменным и входным параметрам блоков можно получить доступ из других блоков, т.е. возможны динамические назначения извне значений таких переменных, отслеживание их значений.
   Места определяются операторами PLACES, которые, как и PUBLIC, могут находиться в любом месте программы:

  PLACES <список переменных с инициализацией>

   Управление состоянием места может осуществляться только из блока, установившего состояние, отличное от FREE, или любым блоком в отношении места с состоянием FREE, с помощью функций

   LockF( <состояние>, <адрес места> [ { , <адрес места> } ]  )

   WRITE_ONLY    - только для записи
   READ_ONLY     - только для чтения
   LOCKED        - запрещено для использования.

или освобождение места - установление состояния FREE

   UnlockF( <адрес места> [ { , <адрес места> } ] ) - разблокирование

перечисленных в параметрах мест.

   WRITE_ONLY, READ_ONLY, LOCKED, FREE  - макросы, которым сопоставлены

числа числовые значения.
   Пользовательской программе разрешается устанавливать собственные состояния - числовые значения свыше 10 и менее 256 - с помощью функции LOCKF и ее параметром <состояние места>:

#macro MY_PLACE_STATUS  11

 
LockF( placename, MY_PLACE_STATUS )

<<< BACK NEXT >>>