|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ГЛАВА 12 - ОЧЕРЕДИ.СТРУКТУРА ОЧЕРЕДИQUEUE (описывает QUEUE-структуру)
метка QUEUE[,PRE]
метка field[,NAME()]
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(очередь[,указатель|[+]ключ,....[-]ключ имя ])
ADD записывает новый элемент в буфер данных ОЧЕРЕДИ. Если недостаточно памяти для добавления нового элемента, то возвращается ошибка "Недостаточно памяти" (Insufficient Memory). 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 (очередь)
DELETE удаляет элемент ОЧЕРЕДИ в позиции, в которой последний раз успешно выполнены GET или ADD, и освобождает память. Если ранее не был выполнен GET или ADD, то возвращается ошибка "Элемент очереди не найден (Queue Entry Not Found). Все указатели вперед и назад будут перестроены, чтобы компенсировать удаленный элемент. Возвращаемые ошибки:
08 Недостаточно памяти
30 Элемент не найден
Пример:
Que:Name = 'Иванов' !Инициализируем ключ
GET(NameQue,Que:Name) !Находим подходящую запись
DELETE(NameQue) !И удаляем ее
FREE (удалить очередь)
FREE (очередь)
FREE удаляет все элементы очереди и освобождает занимаемую ими память. Кроме этого, он удаляет "излишек", выделяемый под саму очередь. Возвращаемые ошибки:
08 Недостаточно памяти
Пример:
FREE(Location) !Удалить очередь МЕСТОНАХОЖДЕНИЕ
FREE(NameQue) !Удалить очередь ИМЯ
GET (получить элемент)
GET(очередь[,указатель [+]ключ,....[-]ключ имя])
GET считывает элемент ОЧЕРЕДИ в буфер данных ОЧЕРЕДИ для обработки. Если GET не находит соответствия, то возвращается ошибка "Элемент очереди не найден (Queue Entry Not Found).
Возвращаемые ошибки:
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(очередь[, [+]ключ,....[-]ключ имя])
PUT перезаписывает содержимое буфера ОЧЕРЕДИ обратно на то место где был выполнен GET или ADD. Если GET или ADD не были выполнены то возвращается ошибка "Элемент очереди не найден (Queue EntryNot Found).
Возвращаемые ошибки:
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(очередь[, [+]ключ,....[-]ключ имя])
SORT переупорядочивает элементы ОЧЕРЕДИ. SORT не занимается перемещением данных, она только изменяет указатели элементов.
Возвращаемые ошибки:
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 (очередь)
Функция POINTER возвращает длинное целое (тип LONG), задающее номер последнего элемента ОЧЕРЕДИ, к которому обращались ADD или GET. Возвращаемый тип данных: LONG Пример:
Que:Name = 'Иванов' !Инициализируем ключевое поле
GET(NameQue,Que:Name) !Получаем элемент
IF ERRORCODE() THEN STOP(ERROR()). ! нет ли ошибок?
SavPoint = POINTER(NameQue) !Сохраняем указатель
RECORDS (количество элементов)
RECORDS (очередь)
Функция RECORDS возвращает длинное целое, содержащее количество элементов в ОЧЕРЕДИ. Возвращаемый тип данных: LONG Пример:
Entries# = RECORDS(Location) !Узнаем количество элементов
LOOP I# = 1 TO Entries# !Обрабатываем всю очередь
GET(Location,I#) ! читая каждый ее элемент
IF ERRORCODE() THEN STOP(ERROR()).
DO SomeProcess ! и обрабатывая его
. !Конец цикла
Назад | Содержание | Вперед |
|
CITForum © 1997–2025