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



 

Часть 19

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

Jew Smile MO Station 2:5040/22.3 Serg Agarkoff +7-(421)-626-8486
время работы станции с 15:00  до 23:30 по московскому времени  в
будние дни и круглосуточно в  выходные и праздники. По этому  же
телефону меня можно застать с 3:00 до 12:00 по московскому  вре-
мени. Спросить капитана Агаркова.

Домашний телефон +7-(421)-626-8486 чс 13:00 до 0:30 по москве.

		      ГЛАВА 12 - ОЧЕРЕДИ

Структура очереди........................................... 12-1
     QUEUE (описывает QUEUE-структуру)...................... 12-1

Процедуры работы с очередями................................ 12-2
     ADD (добавить элемент)................................. 12-2
     DELETE (удалить элемент)............................... 12-4
     FREE (удалить очередь)................................. 12-4
     GET (получить элемент)................................. 12-5
     PUT (перезаписать элемент)............................. 12-7
     SORT (отсортировать очередь)........................... 12-9

Функции работы с очередями.................................. 12-10
     POINTER (указатель на последний элемент)............... 12-10
     RECORDS (количество элементов)......................... 12-10

		       СТРУКТУРА ОЧЕРЕДИ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
QUEUE                                (описывает QUEUE-структуру)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
метка        QUEUE[,PRE]
метка          field[,NAME()]
             .
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

PRE                 Задает префикс структуры.

field               Описание данных. Общий размер описанных дан-
                    ных может быть до 65,000 байт.

QUEUE описывает очередь в памяти. Очередь (QUEUE) - это двусвяз-
ный список, каждый элемент имеет ссылку на предыдущий и последу-
ющий элементы. Метка QUEUE-структуры используется в операторах и
функциях, работающих с очередями. При использовании в операторах
присваивания, QUEUE рассматривается как данное типа GROUP.

Очередь можно  представить как  "файл в  памяти". Под  описанную
очередь выделяется буфер. При добавлении элемента в очередь, под
него динамически выделятеся память, и данные копируются из буфе-
ра в эту область  памяти. При удалении элемента,  выделенная под
него память освобождается. В очереди может быть максимум  65,535
элементов.

Очереди могут использовать виртуальную память, если таковая име-
ется. Это позволяет, теоретически, отвести под очереди до 42 ме-
гов памяти. Под виртуальную память могут быть выделены EMS,  XMS
или место на  диске. Она может  быть разрешена или  запрещена во
время загрузки. Вирутальная память задается переменной окружения
CLAVM. Если виртуальная память недоступна, то очередь хранится в
стандартной памяти  (нижние 640К).  Если в  качестве виртуальной
памяти был выбран только диск, то очередь, насколько это возмож-
но, хранится в стандартной  памяти и в случае  переполнения час-
тично сбрасывается на диск. Если виртуальная память настроена на
EMS/XMS, то очередь сначала будет вестись в EMS/XMS. Затем, если
EMS/XMS не хватает, в стандартной (все это в пределах  виртуаль-
ной памяти), затем снова в EMS/XMS но уже до исчерпания EMS/XMS,
и затем уже будет сбрасываться на диск (если это разрешено).

Память, отводимая под  каждый элемент очереди,  равна суммарному
размеру полей элемента, плюс еще 28 байт (на системные данные  и
указатели), округленных с избытком до ближайшего числа  кратного
16. Например: элемент  состоит из двух  полей: типа LONG  и типа
SHORT (всего 6  байт), и занимает  48 байт (6+26  и округляем до
48). Округление выполняется потому, что память выделяется  16-и-
байтными "параграфами".  Существует, также,  небольшой "излишек"
памяти, выделяемый системой под вновь создающуюся очередь, кото-
рый освобождается только оператором FREE.

Пример:

NameQue  QUEUE,PRE(Nam)                     !Описываем очередь
Name       STRING(20)
Zip        DECIMAL(5,0),NAME('SortField')
         .                                  !Конец описания

См. также: PRE, NAME, FREE, Приложение C

		 ПРОЦЕДУРЫ РАБОТЫ С ОЧЕРЕДЯМИ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ADD                                           (добавить элемент)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
                          і     указатель     і
             ADD(очередь[,і[+]ключ,....[-]ключі])
                          і        имя        і
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка ОЧЕРЕДИ,  или метка  переданного пара-
		    метра типа QUEUE.

указатель           Числовая константа,  переменная или  выраже-
                    ние. Указатель должен быть в диапазоне от  1
                    до ЧИСЛА_ЭЛЕМЕНТОВ_В_ОЧЕРЕДИ.

+-                  Ведущий  знак плюс/минус  означает,  что  по
                    данному  ключу  сортировка  производится  по
                    возрастанию/убыванию.

ключ                Метка поля,  описанного в  составе  ОЧЕРЕДИ.
                    Если ОЧЕРЕДЬ  имеет префикс,  то КЛЮЧ  также
                    ДОЛЖЕН иметь его.

имя                 Строковая константа, переменная или  выраже-
		    ние,  содержащая  атрибуты  NAME  для полей,
                    входящих в состав ОЧЕРЕДИ, разделенные запя-
                    тыми и с необязательным ведущим знаком + или
                    - для каждого атрибута. Этот параметр чувст-
                    вителен к регистру букв.

ADD записывает новый элемент в буфер данных ОЧЕРЕДИ. Если  недо-
статочно памяти для добавления нового элемента, то  возвращается
ошибка "Недостаточно памяти" (Insufficient Memory).

ADD(очередь)        Дописывает новый элемент в конец ОЧЕРЕДИ.

ADD(очередь,указатель)
		    Вставляет новый элемент в относительную  по-
                    зицию, задаваемую параметром УКАЗАТЕЛЬ. Если
		    в этой позиции уже есть элемент, то он "про-
		    талкивается  вниз",  чтобы  освободить место
		    для нового элемента. Все последующие  указа-
		    тели перестраиваются с учетом нового элемен-
		    та. Например, элемент, добавленный в позицию
		    10, вытолкнет старый десятый элемент в пози-
		    цию 11, эелмент 11 - в плзицию 12 и т.д. Ес-
		    ли УКАЗАТЕЛЬ=0 или больше общего числа  эле-
		    ментов ОЧЕРЕДИ, то элемент будет добавлен  в
                    конец очереди.

ADD(очередь,ключ)   Вставляет новый  элемент  в  отсортированную
                    ОЧЕРЕДЬ.  Можно  использовать  до 16 ключей,
                    разделенных запятыми, с необязательным веду-
                    щим знаком плюс или минус, чтобы задать сор-
                    тировку по возрастанию или убыванию. Элемент
                    будет  вставлен  сразу  после тех элементов,
                    которые соответствуют значениям ключей. Если
                    ОЧЕРЕДЬ еще пуста, то ADD(очередь,ключ) мож-
                    но использовать для построения сразу  отсор-
		    тированной ОЧЕРЕДИ.

ADD(очередь,имя)    Вставляет новый  элемент  в  отсортированную
                    ОЧЕРЕДЬ. Строка ИМЯ должна содержать атрибу-
                    ты полей NAME, разделенные запятыми и с нео-
                    бязательными знаками плюс или минус для  за-
                    дания порядка сортировки. Элемент вставляет-
                    ся сразу после тех записей, которые соответ-
                    ствуют значениям полей. Если ОЧЕРЕДЬ еще пу-
		    ста, то ADD(очередь,имя) можно  использовать
		    для построения сразу отсортированной  ОЧЕРЕ-
		    ДИ.

Возвращаемые ошибки:
          08 Недостаточно памяти
	  75 Неверный описатель типа поля

Пример:

NameQue  QUEUE,PRE(Que)
Name       STRING(20),NAME('FirstField')
Zip        DECIMAL(5,0),NAME('SecondField')
        .
  CODE
  ADD(NameQue)             !Добавить элемент в конец очереди

  ADD(NameQue,1)           !Вставить элемент в первую позицию

  Que:Name = 'Иванов'      !Инициализируем поля
  Que:Zip = 12345
  ADD(NameQue,+Que:Name,-Que:Zip)
                           !ИМЯ - по возрастанию, ИНДЕКС - по
			   !  убыванию

  Que:Name = 'Кузнецов'    !Инициализируем поля
  Que:Zip = 12345
  ADD(NameQue,'+FirstField,-SecondField')
                           !Add in name, descending zip order

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
DELETE                                         (удалить элемент)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             DELETE(очередь)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка QUEUE-структуры, или метка переданного
                    параметра типа QUEUE.

DELETE удаляет  элемент ОЧЕРЕДИ  в позиции,  в которой последний
раз упешно выполнены GET или ADD, и освобождает память. Если ра-
нее не был выполнен GET или ADD, то возвращается ошибка "Элемент
очереди не найден (Queue Entry Not Found). Все указатели  вперед
и назад будут  перестроены, чтобы компенсировать  удаленный эле-
мент.

Возвращаемые ошибки:
	  08 Недостаточно памяти
	  30 Элемент не найден

Пример:

  Que:Name = 'Иванов'                 !Инициализируем ключ
  GET(NameQue,Que:Name)               !Находим подходящую запись
  DELETE(NameQue)                     !И удаляем ее

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
FREE                                           (удалить очередь)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             FREE(очередь)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка QUEUE-структуры, или метка переданного
                    параметра типа QUEUE.

FREE удаляет все элементы  очереди и освобождает занимаемую  ими
память. Кроме этого, он  удаляет "излишек", выделяемый под  саму
очередь.

Возвращаемые ошибки:
          08 Недостаточно памяти

Пример:

    FREE(Location)              !Удалить очередь МЕСТОНАХОЖДЕНИЕ

    FREE(NameQue)               !Удалить очередь ИМЯ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
GET                                           (получить элемент)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
                     і     указатель     і
        GET(очередь[,і[+]ключ,....[-]ключі])
                     і        имя        і
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка ОЧЕРЕДИ,  или метка  переданного пара-
		    метра типа QUEUE.

указатель           Числовая константа,  переменная или  выраже-
                    ние. Указатель должен быть в диапазоне от  1
                    до ЧИСЛА_ЭЛЕМЕНТОВ_В_ОЧЕРЕДИ.

+-                  Ведущий  знак плюс/минус  означает,  что  по
                    данному  ключу  сортировка  производится  по
                    возрастанию/убыванию.

ключ                Метка поля,  описанного в  составе  ОЧЕРЕДИ.
                    Если ОЧЕРЕДЬ  имеет префикс,  то КЛЮЧ  также
                    ДОЛЖЕН иметь его.

имя                 Строковая константа, переменная или  выраже-
		    ние,  содержащая  атрибуты  NAME  для полей,
                    входящих в состав ОЧЕРЕДИ, разделенные запя-
                    тыми и с необязательным ведущим знаком + или
                    - для каждого атрибута. Этот параметр чувст-
                    вителен к регистру букв.

GET считывает элемент ОЧЕРЕДИ  в буфер данных ОЧЕРЕДИ  для обра-
ботки. Если GET не находит соответствия, то возвращается  ошибка
"Элемент очереди не найден (Queue Entry Not Found).

GET(очередь,указатель)
		    Возвращает  элемент  из  позиции, задаваемой
                    значением УКАЗАТЕЛЯ.

GET(очередь,ключ)   Ищет элемент ОЧЕРЕДИ, который  соответствует
                    значению поля(полей) ключа. Можно  использо-
                    вать  до  16  ключей,  разделенных запятыми.
                    ОЧЕРЕДЬ должна быть уже отсортирована по по-
                    лям, используемым в качестве ключевых.

GET(очередь,имя)    Ищет элемент ОЧЕРЕДИ, который  соответствует
                    значению поля(полей) имени. Строка ИМЯ долж-
                    на содердать NAME-атрибуты полей,  разделен-
                    ные запятыми с необязательным ведущим знаком
                    плюс или минус для задания порядка сортиров-
                    ки. ОЧЕРЕДЬ должна уже быть отсортирована по
                    полям, перечисленным в параметре ИМЯ.

Возвращаемые ошибки:
	  08 Недостаточно памяти
	  30 Элемент не найден
	  75 Неверный описатель типа поля

Пример:

NameQue   QUEUE,PRE(Que)
Name        STRING(20),NAME('FirstField')
Zip         DECIMAL(5,O),NAME('SecondField')
          .
  CODE
                              !здесь мы строим очередь...
  GET(NameQue,1)                      !Читаем первый элемент
   IF ERRORCODE() THEN STOP(ERROR()).

  Que:Name = 'Иванов'              !Инициализируем ключевое поле
  GET(NameQue,Que:Name)            !Находим подходящую запись
    IF ERRORCODE() THEN STOP(ERROR()).

  Que:Name = Fil:Name     !Берем начальное значенние из Fil:Name
  GET(NameQue,Que:Name)            !Находим подходящую запись
    IF ERRORCODE() THEN STOP(ERROR()).

  Que:Name = 'Кузнецов'            !Инициализируем ключевые поля
  Que:Zip = 12345
  GET(NameQue,'FirstField,SecondField')
  				   !Находим подходящую запись
    IF ERRORCODE() THEN STOP(ERROR()).

См. также:  SORT

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
PUT                                       (перезаписать элемент)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
        PUT(очередь[,і[+]ключ,....[-]ключі])
                     і        имя        і
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка ОЧЕРЕДИ,  или метка  переданного пара-
		    метра типа QUEUE.

+-                  Ведущий  знак плюс/минус  означает,  что  по
                    данному  ключу  сортировка  производится  по
                    возрастанию/убыванию.

ключ                Метка поля,  описанного в  составе  ОЧЕРЕДИ.
                    Если ОЧЕРЕДЬ  имеет префикс,  то КЛЮЧ  также
                    ДОЛЖЕН иметь его.

имя                 Строковая константа, переменная или  выраже-
		    ние,  содержащая  атрибуты  NAME  для полей,
                    входящих в состав ОЧЕРЕДИ, разделенные запя-
                    тыми и с необязательным ведущим знаком + или
                    - для каждого атрибута. Этот параметр чувст-
                    вителен к регистру букв.

PUT перезаписывает содержимое буфера ОЧЕРЕДИ обратно на то место
где был выполнен GET или ADD. Если GET или ADD не были выполнены
то возвращается  ошибка "Элемент очереди не найден (Queue  Entry
Not Found).

PUT(очередь)        Записывает буфер обратно в ту же относитель-
                    ную позицию в очереди, где был выполнен  по-
                    следний успешный GET или ADD.

PUT(очередь,ключ)   Возвращает элемент в отсортированную очередь
                    после успешного GET или ADD, соблюдая  поря-
                    док сортировки  если были  изменены значения
                    ключевых полей. Можно   использовать  до  16
		    ключей, разделенных запятыми, с необязатель-
		    ным ведущим знаком плюс или минус, чтобы за-
		    дать сортировку по возрастанию или убыванию.
		    Элемент будет вставлен сразу после тех  эле-
		    ментов, которые соответствуют значениям клю-
		    чей.

PUT(очередь,имя)    Возвращает элемент в отсортированную очередь
		    после успешного GET или ADD, соблюдая  поря-
		    док сортировки  если были  изменены значения
                    ключевых полей. Строка ИМЯ должна  содержать
		    NAME-атрибуты полей, разделенные запятыми  и
		    с необязательными знаками плюс или минус для
		    задания порядка сортировки. Элемент вставля-
		    ется сразу после тех элементов, которые  со-
		    ответствуют значениям полей.

Возвращаемые ошибки:
	  08 Недостаточно памяти
	  30 Элемент не найден
	  75 Неверный описатель типа поля

Пример:

NameQue   QUEUE,PRE(Que)
Name        STRING(20),NAME('FirstField')
Zip         DECIMAL(5,0),NAME('SecondField')
          .
  CODE
                              !здесь мы строим очередь...
  Que:Name = 'Иванов'              !Инициализируем ключевое поле
  GET(NameQue,Que:Name)            !Находим подходящую запись
    IF ERRORCODE() THEN STOP(ERROR()).

   Que:Zip = 12345               !Изменяем почтовый индекс
   PUT(NameQue)                  !Записываем изменения в очередь
     IF ERRORCODE() THEN STOP(ERROR()).

   Que:Name  =  'Иванов'           !Инициализируем ключевое поле
   GET(NameQue,Que:Name)           !Находим подходящую запись
     IF ERRORCODE() THEN STOP(ERROR()).

   Que:Name = 'Кузнецов'                !Изменяем ключевое поле
   PUT(NameQue.Que:Name)         !Записываем изменения в очередь
     IF ERRORCODE() THEN STOP(ERROR()).

   Que:Name  =  'Кузнецов'         !Инициализируем ключевое поле
   GET(NameOue,'FirstField')       !Находим подходящую запись
     IF ERRORCODE() THEN STOP(ERROR()).

   Que:Name = 'Иванов'                !Изменяем ключевое поле
   PUT(NameQue,'FirstField')     !Записываем изменения в очередь
     IF  ERRORCODE()  THEN   STOP(ERROR()).

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
SORT                                     (отсортировать очередь)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
       SORT(очередь[,і[+]ключ,....[-]ключі])
                     і        имя        і
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка ОЧЕРЕДИ,  или метка  переданного пара-
		    метра типа QUEUE.

+-                  Ведущий  знак плюс/минус  означает,  что  по
                    данному  ключу  сортировка  производится  по
                    возрастанию/убыванию.

ключ                Метка поля,  описанного в  составе  ОЧЕРЕДИ.
                    Если ОЧЕРЕДЬ  имеет префикс,  то КЛЮЧ  также
                    ДОЛЖЕН иметь его.

имя                 Строковая константа, переменная или  выраже-
		    ние,  содержащая  атрибуты  NAME  для полей,
                    входящих в состав ОЧЕРЕДИ, разделенные запя-
                    тыми и с необязательным ведущим знаком + или
                    - для каждого атрибута. Этот параметр чувст-
                    вителен к регистру букв.

SORT переупорядочивает элементы ОЧЕРЕДИ. SORT не занимается  пе-
ремещением данных, она только изменяет указатели элементов.

SORT(очередь,ключ)  Сортирует ОЧЕРЕДЬ в порядке, задаваемом клю-
                    чом. Можно использовать до 16 ключей, разде-
		    ленных  запятыми,  с  необязательным ведущим
		    знаком плюс или  минус, чтобы задать  сорти-
		    ровку по возрастанию или убыванию.

SORT(очередь,имя)   Сортирует  ОЧЕРЕДЬ  в  порядке,   задаваемом
                    строкой ИМЯ. Строка ИМЯ должна содержать NA-
		    ME-атрибуты полей, разделенные запятыми и  с
		    необязательными знаками  плюс или  минус для
		    задания порядка сортировки.

Возвращаемые ошибки:
          08 Недостаточно памяти
	  75 Неверный описатель типа поля

Пример:

Location  QUEUE,PRE(Loc)
Name        STRING(20),NAME('FirstField')
City        STRING(10),NAME('SecondField')
State       STRING(2)
Zip         DECIMAL(5.0)
          .
  CODE
  SORT(Location,Loc:State,Loc:City,Loc:Zip)
                                !Сортируем по индексу в пределах
				! города в пределах штата
  SORT(Location,+Loc:State,-Loc:Zip)
                                !Сортируем по индексу в пределах
				! штата по убыванию
  SORT(Location,'FirstField,-SecondField')
                                !Сортируем по убыванию по имени
				! города

		  ФУНКЦИИ РАБОТЫ С ОЧЕРЕДЯМИ

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
POINTER                         (указатель на последний элемент)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             POINTER(очередь)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка ОЧЕРЕДИ,  или метка  переданного пара-
		    метра типа QUEUE.

Функция POINTER  возвращает длинное  целое (тип  LONG), задающее
номер последнего элемента ОЧЕРЕДИ, к которому обращались ADD или
GET.

Возвращаемый тип данных: LONG

Пример:

  Que:Name = 'Иванов'              !Инициализируем ключевое поле
  GET(NameQue,Que:Name)                  !Получаем элемент
    IF ERRORCODE() THEN STOP(ERROR()).   !  нет ли ошибок?
  SavPoint = POINTER(NameQue)            !Сохраняем указатель

ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
RECORDS                                   (количество элементов)
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
             RECORDS(очередь)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

очередь             Метка ОЧЕРЕДИ,  или метка  переданного пара-
		    метра типа QUEUE.

Функция RECORDS возвращает длинное целое, содержащее  количество
элементов в ОЧЕРЕДИ.

Возвращаемый тип данных: LONG

Пример:

  Entries# = RECORDS(Location)      !Узнаем количество элементов
  LOOP I# = 1 TO Entries#           !Обрабатываем всю очередь
    GET(Location,I#)                ! читая каждый ее элемент
      IF ERRORCODE() THEN STOP(ERROR()).
    DO SomeProcess                  ! и обрабатываая его
  .                                 !Конец цикла


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