Страница 2 из 2

Ссылки на GROUP

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

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

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

Ссылки на GROUP

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

Ссылки на GROUP

Добавлено: 13 Январь 2020, 16:42
Игорь Столяров
Дед Пахом писал(а): 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 не работает именно внутри класса - непонятно.
Что-то здесь не то совсем. :(

Ссылки на GROUP

Добавлено: 13 Январь 2020, 17:19
finsoftrz
А объявление кьи структуры вместо группы не сработает?

Ссылки на GROUP

Добавлено: 13 Январь 2020, 20:42
finsoftrz
Еще как вариант можно попробовать декларировать группу внутри clw без type. Это что-то по типу модульных переменных получается. Все методы класса их видят.

Ссылки на GROUP

Добавлено: 13 Январь 2020, 21:06
Игорь Столяров
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 КБ) 2613 просмотров
(С) Каштанка, А.П. Чехов

Ссылки на GROUP

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

Ссылки на GROUP

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

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

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

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

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

Какие ещё могут быть варианты ? :(

Ссылки на GROUP

Добавлено: 13 Январь 2020, 23:09
Дед Пахом
Судя по примеру с их сайта, это не мой случай :(

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

    my_symbol = ZBarcode_Create();
    my_symbol->input_mode = UNICODE_MODE;

Ссылки на GROUP

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

Ссылки на GROUP

Добавлено: 13 Январь 2020, 23:22
Игорь Столяров
Дед Пахом писал(а): 13 Январь 2020, 23:09my_symbol->input_mode = UNICODE_MODE
Так вот и я о том же … :(

Ссылки на GROUP

Добавлено: 13 Январь 2020, 23:46
Дед Пахом
Я бы сделал как-то так...

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

  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

Ссылки на GROUP

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