Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

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

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

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 EntryNot 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(очередь,имя) Сортирует ОЧЕРЕДЬ в порядке, задаваемом строкой ИМЯ. Строка ИМЯ должна содержать NAME-атрибуты полей, разделенные запятыми и с необязательными знаками плюс или минус для задания порядка сортировки.

Возвращаемые ошибки:


    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                  ! и обрабатывая его

     .                                 !Конец цикла

Назад | Содержание | Вперед

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...