Ссылки на GROUP

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4364
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а):
13 Январь 2020, 16:00
Объявите LIKE(TGroup) в классе, и проблем не будет:
Уже пробовал - не работает. :(
Мне нужен именно адрес структуры данных, потому что работа с ней идёт через функции в DLL на VC6:

Код: Выделить всё

  Self.MyGroup  &= ZBarcode_Create()
  If ~(Self.MyGroupl &= NULL) then Self.FlagLoad = True.
Если без класса, то всё прекрасно объявляется и работает ...
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2341
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Ссылки на GROUP

Сообщение Дед Пахом »

Игорь Столяров писал(а):
13 Январь 2020, 16:20
Мне нужен именно адрес структуры данных
и кто мешает в DLL передать ADDRESS(Self.MyGroup)?
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4364
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а):
13 Январь 2020, 16:27
и кто мешает в DLL передать ADDRESS(Self.MyGroup)
Именно так далее работа и идёт с группой по адресу … но !
Сначала ведь надо инициализировать эту структуру данных получив её адрес ИЗ DLL …

Код: Выделить всё

   Self.MyGroup  &= ZBarcode_Create()  ! Вот здесь проблемка-с
   ...
   If ~(Self.MyGroupl &= NULL)
      ZBarcode_Encode(Address(Self.MyGroup),Loc:Cod,0) 
      ! и т.д. здесь всё понятно и проблем нет
В принципе, ZBarcode_Create() возвращает просто ULONG с адресом на созданную им структуру данных (*Struct),
но почему элементарное объявление MyGroup &TGroup не работает именно внутри класса - непонятно.
Что-то здесь не то совсем. :(
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1416
Зарегистрирован: 06 Ноябрь 2014, 12:48

Ссылки на GROUP

Сообщение finsoftrz »

А объявление кьи структуры вместо группы не сработает?
Рязань решает.

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1416
Зарегистрирован: 06 Ноябрь 2014, 12:48

Ссылки на GROUP

Сообщение finsoftrz »

Еще как вариант можно попробовать декларировать группу внутри clw без type. Это что-то по типу модульных переменных получается. Все методы класса их видят.
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4364
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Ссылки на GROUP

Сообщение Игорь Столяров »

finsoftrz писал(а):
13 Январь 2020, 20:42
Еще как вариант можно попробовать декларировать группу внутри clw без type
Можно. Но по сути это получится просто объявление в Global … со всеми вытекающими последствиями. ;)
А ещё можно пойти на изврат и обмануть компилятор там, где он этого меньше всего ожидал … ;)

Код: Выделить всё

TGroup         Group,Type
Number             Long
Phone                CString(121)
                    end

XXX Group,Type   ! 1. ЗАВОРАЧИВАЕМ ССЫЛКУ НА ГРУППУ
YYY &TGroup
  end                    

TClass           Class, Type, Module('XXX.clw'), Link('XXX.clw')
!MyGroup              &TGroup     ! <--- ОШИБКА: НЕВЕРНЫЙ ТИП ДАННЫХ
MyGroup               Like(XXX)    ! 2. Теперь в MyGroup.YYY у нас есть &TGroup
FlagLoad              Byte(False)
                    end
Компьютер супротив человека, всё равно что плотник супротив столяра !
smile28.gif
smile28.gif (8.19 КБ) 115 просмотров
(С) Каштанка, А.П. Чехов
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2341
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Ссылки на GROUP

Сообщение Дед Пахом »

Не знаю, что Вы там за библиотеку курочите, но обычно C api устроено так: есть некая внутренняя структура (struct, GROUP по нашему), содержимое которой спрятано внутри и наружу обычно не выдаётся; есть инициализирующая функция, которая при успешном выполнении возвращает адрес этой структуры (void*, по нашему LONG, обычно называется хэндл); есть другие функции, которые в качестве аргумента получают этот хэндл.
То есть обычно (я много всяких сишных библиотек адаптировал, все так устроены) GROUP или ссылка на GROUP не нужна, достаточно адреса.
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4364
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Ссылки на GROUP

Сообщение Игорь Столяров »

Полностью согласен, возможно я чего-то изначально не понимаю … :(
Потрошу библиотеку ZINT: https://sourceforge.net/projects/zint/

Да, есть внутренняя структура и я получаю её адрес из DLL и есть методы в DLL,
которые выполняют операции и в них передаётся адрес структуры.

Но перед вызовом методов, нужно выполнить установку некоторых параметров в этой структуре данных … :(
Вижу два варианта:

1. Описать эту структуру как GROUP, инициализировать её по адресу и менять параметры (поля GROUP).
За основу взял пример с ClaList и всё работает, пока не возникла проблема с объявлением &MyGroup внутри класса.

2. Напрямую записывать параметры по адресу структуры со смещением, через memcpy().
Но там разные типы данных - и это большая головная боль ...

Какие ещё могут быть варианты ? :(
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2341
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Ссылки на GROUP

Сообщение Дед Пахом »

Судя по примеру с их сайта, это не мой случай :(

Код: Выделить всё

    my_symbol = ZBarcode_Create();
    my_symbol->input_mode = UNICODE_MODE;
С уважением, ДП

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 919
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

Ссылки на GROUP

Сообщение RaFaeL »

Если ты можешь сам создать структуру, то создавай и передавай адрес. В классе описывай при этом просто как группу, не как указатель. Не забыть про выравнивание полей
Если надо именно записать в структуру, созданную библиотекой, то через прямую работу с памятью пожалуй проще всего. А какие там типы сложные? Real он же Double разве что, а всякие там строки один фиг тоже через адреса передаются
Еще можно, наверное (сам не пробовал), создать метод класса как (*Tgroup) и передавать туда этот полученный от библиотеки адрес, должно по идее тоже сработать, а внутри уже работать с полями

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4364
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а):
13 Январь 2020, 23:09
my_symbol->input_mode = UNICODE_MODE
Так вот и я о том же … :(
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2341
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Ссылки на GROUP

Сообщение Дед Пахом »

Я бы сделал как-то так...

Код: Выделить всё

  PROGRAM

TGroup                        GROUP, TYPE
i                               LONG
r                               REAL
                              END

internalGrp                   LIKE(TGroup)
handle                        LONG, AUTO

  MAP
    GetGroupRef(), LONG
    SetInt(LONG pHandle, LONG pValue)
  END

  CODE
  handle = GetGroupRef()
  SetInt(handle, 200)
  MESSAGE('i='& internalGrp.i &'; r='& internalGrp.r)

GetGroupRef                   PROCEDURE()
  CODE
  internalGrp.i = 100
  internalGrp.r = 3.14
  RETURN ADDRESS(internalGrp)
  
SetInt                        PROCEDURE(LONG pHandle, LONG pValue)
thisGrp                         &TGroup
  CODE
  thisGrp &= (pHandle)
  thisGrp.i = pValue
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4364
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Ссылки на GROUP

Сообщение Игорь Столяров »

Дед Пахом писал(а):
13 Январь 2020, 23:46
SetInt PROCEDURE(LONG pHandle, LONG pValue)
thisGrp &TGroup
CODE
thisGrp &= (pHandle)
thisGrp.i = pValue
Спасибо ! :) Это очень красивое решение вопроса.
Всё работает, теперь пошла рутина - наполнение класса методами и т.д. :)
«V» значит Вендетта !

Ответить