Копирование элементов очереди в массив

SK> Возник вопрос, а возможно ли копировать значения
SK> из очереди в массив быстрее чем с использование
SK> стандартного оператора GET(Que,Ind)

Вообще-то, не так давно в этом списке уже был подобный вопрос. И ответ на него был вполне определенный — НЕТ.

MyQue QUEUE
X SHORT
  END

MyTmpArr SHORT,DIM(N)   ! Число массива определяется числом записи очереди

...    ! Заполнение очереди N - записей

Далее нужно элементы очереди поместить в массив

! Сейчас делается так:

SizeQue# = Records(MyQue)
LOOP Ind#=1 TO SizeQue
   GET(MyQue,Ind#)
   MyTmpArr[Ind#] = MyQue.X
END

...  ! Использование массива

SK> Что то мне подсказывает, что если использовать
SK> внутренний механизм QUEUE и сделать проход по очереди
SK> через соответствующие указатели то будет побыстрее ….
SK> Попробовал пока не получается получить значение из записи,
SK> мож конечно что то не так делаю… и имеет ли это смысл ?
SK> Если возможно подскажи пожалуйста как это сделать …
SK> Если нет, то просьба сообщить чтоб зазря не париться…

Если поищешь в архивах данной рассылки или на общедоступных серверах по Клариону, то найдешь мои письма с описанием внутреннего строения и механизма работы Кларионовских очередей. Почитай внимательно и сам найдешь ответ на свой вопрос.

Если в младших версиях Клариона еще имело смысл получение указателя на определенную запись (и то лишь чисто в познавательных целях, так как GET() это делает так-же быстро и намного надежнее), то в последних версиях это просто бессмысленно! Все дело в том, что в очередях с размером записи больше 127 байт все записи хранятся в упакованном виде. Так что, даже если и получишь прямой указатель на нужную записи, то может возникнуть необходимость предварительно ее распаковать.

Но в любом случае GET() работает так-же быстро и уж точно более надежно чем обычная ручная выборка.

Да, еще забыл добавить, что в памяти записи хранятся не подряд, а в разнобой. Так что здесь не подойдет прямое копирование всех записей в массив, которое было-бы, конечно, намного быстрее GET().