Страница 1 из 2
Массив указателей
Добавлено: 26 Июль 2019, 7:03
Игорь Столяров
Привет всем !
Подскажите пожалуйста, а существует ли в Clarion какой-нибудь способ объявить массив указателей ?
Например, мне нужно передавать на загрузку заранее известное кол-во обезличенных разных очередей.
Т.е. должно быть объявление, что-то вроде:
Вроде бы ничего военного, но транслятор сразу говорит, что номер глух по сути и содержанию.
Или такие структуры можно создать как-то по другому ?
Массив указателей
Добавлено: 26 Июль 2019, 7:34
RaFaeL
Очередь указателей чем не подходит?
Массив указателей
Добавлено: 26 Июль 2019, 8:19
Игорь Столяров
RaFaeL писал(а): 26 Июль 2019, 7:34Очередь указателей чем не подходит?
Я думал в эту сторону - не очень удобно. Во первых для передачи параметров внутри группы - это снова делать
указатель на типизированную очередь указателей (QUEUE внутри GROUP не может быть).
Во-вторых добавлять записи, считывать записи …
Но если современная наука ничего другого не предложит - то видимо придётся делать через QUEUE указателей.
Массив указателей
Добавлено: 26 Июль 2019, 8:49
finsoftrz
Через массив long и address не подходит?
Массив указателей
Добавлено: 26 Июль 2019, 9:27
Игорь Столяров
finsoftrz писал(а): 26 Июль 2019, 8:49Через массив long и address не подходит?
Адрес как цифру передать-то конечно можно … но ведь потом хотелось бы к нему применять WHO / WHAT для разбора
структуры QUEUE …
Массив указателей
Добавлено: 26 Июль 2019, 9:33
Дед Пахом
Для очередей надо использовать не address(), а instance(), правда эта функция появилась только в C8 или даже позже.
Массив указателей
Добавлено: 26 Июль 2019, 9:48
finsoftrz
instance в C6 тоже есть.
Массив указателей
Добавлено: 26 Июль 2019, 10:01
Дед Пахом
finsoftrz писал(а): 26 Июль 2019, 9:48instance в C6 тоже есть.
Действительно есть, не знаю, почему я был уверен, что это новая фича.
Массив указателей
Добавлено: 26 Июль 2019, 10:01
Дед Пахом
finsoftrz писал(а): 26 Июль 2019, 9:48instance в C6 тоже есть.
Действительно есть, не знаю, почему я был уверен, что это новая фича.
Массив указателей
Добавлено: 26 Июль 2019, 10:07
finsoftrz
Вот так работает в С6.
Код: Выделить всё
form_r routine
DATA
lor:queue queue, pre()
lor:str string(10)
.
lor:queue2 &queue
CODE
lor:str='111'
add(lor:queue)
lor:queue2 &= instance(lor:queue,2)
stop(records(lor:queue2))
stop(who(lor:queue2,1))
free(lor:queue)
Массив указателей
Добавлено: 26 Июль 2019, 10:12
finsoftrz
Или вот так, для Игоря.
Код: Выделить всё
form_r routine
DATA
lor:queue queue, pre()
lor:str string(10)
.
lor:queue2 &queue
lor:inst long
CODE
lor:str='111'
add(lor:queue)
lor:inst = instance(lor:queue,2)
lor:queue2 &= (lor:inst)
stop(records(lor:queue2))
stop(who(lor:queue2,1))
free(lor:queue)
Массив указателей
Добавлено: 26 Июль 2019, 10:15
Игорь Столяров
Спасибо ! Впервые узнал о существовании оператора INSTANCE, если честно …
Тогда получается, что INSTANCE(QUEUE,THREAD()) позволяет создать массив LONG c адресами QUEUE и задача решена.

Пошёл пробовать …

Массив указателей
Добавлено: 26 Июль 2019, 12:03
Yufil
Я у себя в программе пользую класс
DumpClass, цель-сохранить данные сессии ( очереди, группы, простые переменные ) в Blob, а потом через какое-то время восстановить в исходном виде. Не оно ?
Код: Выделить всё
P Class(DumpClass)
End
! Регистрим очереди
P.AddField('ZTstQ',TstQ)
P.AddField('ResQ',ResQ)
P.AddField('Qlist',QList)
! Регистрим группу
P.AddField('QGroup',QGroup)
! Сохраняем сессию
P.SaveBlob( Ses:Info )
! Восстанавливаем сессию, очереди и группы восстанавливают состояние
P.LoadBlob( Ses:Info )
Массив указателей
Добавлено: 26 Июль 2019, 16:52
vic7tar
А такой вариант не подойдет?
Массив указателей
Добавлено: 26 Июль 2019, 18:41
Игорь Столяров
vic7tar писал(а): 26 Июль 2019, 16:52А такой вариант не подойдет?
Очень даже подойдёт ! Спасибо !
По сути - этот вариант и самый оптимальный, т.к. сохраняется возможность проверки адреса QUEUE на NULL ...