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

Совместимость типов данных

Добавлено: 05 Апрель 2021, 15:16
Игорь Столяров
Привет всем ! :)

Мне нужно передать во внешнюю DLL на C структуру данных (фрагмент):

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

    struct zint_symbol {
        char fgcolour[10];
        char *fgcolor; // pointer to fgcolour
        char bgcolour[10];
        char *bgcolor; // pointer to bgcolour
	}
и у меня это получается, но только при вот таком странном описании на Clarion:

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

TZintSymbol         Group,Type
fgcolour              CString(10)
fgcolor               CString(6)  ! pointer to fgcolour
bgcolour              CString(10)
bgcolor               CString(6)  ! pointer to bgcolour
  end
Разве может быть указатель (а "char *fgcolor" - это ведь указатель ?) длиной 6 Byte ?! :(
Заранее спасибо за помощь, потому как это совсем тупик моих знаний. :(

Совместимость типов данных

Добавлено: 05 Апрель 2021, 17:28
kreator
Указатели - это LONG в чистом виде. В 64-битных, возможно, два LONG. Может от этого защита. От дурака. А что в приведённой структуре?

Совместимость типов данных

Добавлено: 05 Апрель 2021, 17:52
RaFaeL
Возможно, дело в выравнивании
https://forum.clarionlife.net/viewtopic.php?f=5&t=4072

Совместимость типов данных

Добавлено: 05 Апрель 2021, 18:35
RaFaeL
P.S. Вероятно правильно будет CString(11) все-таки либо String(10)

Совместимость типов данных

Добавлено: 05 Апрель 2021, 18:41
Игорь Столяров
kreator писал(а): 05 Апрель 2021, 17:28 Указатели - это LONG в чистом виде.
Тоже так думал первую половину дня. :)
Здесь ещё надо учитывать, что это бесплатный OpenSource - а его пишут как письмо дяде Фёдору из Простоквашино. ;)

Совместимость типов данных

Добавлено: 05 Апрель 2021, 18:44
Игорь Столяров
RaFaeL писал(а): 05 Апрель 2021, 18:35 Вероятно правильно будет CString(11) все-таки либо String(10)
Спасибо ! Я выбрал вот такой вариант, с ним всё работает как часы. Но непонятно почему. :shock:

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

TZintSymbol         Group,Type
fgcolour              CString(10)
fgcolor               CString(6)  ! pointer to fgcolour
bgcolour              CString(10)
bgcolor               CString(6)  ! pointer to bgcolour
  end

Совместимость типов данных

Добавлено: 05 Апрель 2021, 19:06
RaFaeL
Игорь Столяров писал(а): 05 Апрель 2021, 18:44 Но непонятно почему
Так я же дал ссылку, почему...
Думаю, надо не подгонять методом тыка, а разобраться, как правильно
А что в эти поля в итоге присваивается?

Совместимость типов данных

Добавлено: 05 Апрель 2021, 19:14
Игорь Столяров
RaFaeL писал(а): 05 Апрель 2021, 19:06 А что в эти поля в итоге присваивается?
В сами поля fgcolour / bgcolour записывается цвет кода/фона в виде текста "FFFFFF" и т.д.
Судя по любезно оставленному неизвестным автором комментария - добавили ссылки на поля с цветом - см. первое сообщение.
Как они используются, в каком формате, что в них пишет DLL - я не знаю и надеюсь, что не узнаю. :)

Совместимость типов данных

Добавлено: 05 Апрель 2021, 19:36
kreator
Игорь Столяров писал(а): 05 Апрель 2021, 19:14 В сами поля fgcolour / bgcolour записывается цвет кода/фона в виде текста "FFFFFF" и т.д.
Ну шесть символов! А десять зачем? На будущее?

Совместимость типов данных

Добавлено: 05 Апрель 2021, 19:36
RaFaeL
Ну т.е. поля указателей не используются, а используется только 2 раза по 6 байт, с 1 по 6 и с 17 по 22, так? Тогда можно оставить все как есть Но про выравнивание все-таки почитайте

Совместимость типов данных

Добавлено: 05 Апрель 2021, 19:54
Игорь Столяров
kreator писал(а): 05 Апрель 2021, 19:36 Ну шесть символов! А десять зачем? На будущее?
Можно только догадываться ... :)
Вскрыл исходники - там описание структуры на сях, которую нужно передать в DLL.
Почему в ней цвет кодируется в 10-ти символах ? ХЗ. Почему явно указатель занимает 6 Byte ? ХЗ ... :)

Совместимость типов данных

Добавлено: 05 Апрель 2021, 20:23
RaFaeL
Игорь Столяров писал(а): 05 Апрель 2021, 19:54 Почему явно указатель занимает 6 Byte ?
Указатель занимает 4 байта, еще 2 байта не занимает ничего, просто вам надо 3й параметр расположить с начиная байта, кратного длине Long (если с 0 считать то это 16й байт, ну или 17й если с 1)

Совместимость типов данных

Добавлено: 05 Апрель 2021, 20:29
Игорь Столяров
RaFaeL писал(а): 05 Апрель 2021, 20:23 еще 2 байта не занимает ничего
Это то, к чему я пришёл методом тыка.
Меня больше интересует почему то, что в тексте на сях "char *fgcolor;" переводится на Clarion
как "4 Byte на указатель + 2 Byte в которых нет ничего". Вот вопрос в чём ... :)

Совместимость типов данных

Добавлено: 06 Апрель 2021, 0:31
kreator
RaFaeL писал(а): 05 Апрель 2021, 20:23
Игорь Столяров писал(а): 05 Апрель 2021, 19:54 Почему явно указатель занимает 6 Byte ?
Указатель занимает 4 байта, еще 2 байта не занимает ничего, просто вам надо 3й параметр расположить с начиная байта, кратного длине Long (если с 0 считать то это 16й байт, ну или 17й если с 1)
Я понял. Чума. Сишники с ума сошли?

Совместимость типов данных

Добавлено: 06 Апрель 2021, 6:38
Игорь Столяров
С этим проектом (ZINT) смешанные чувства.

С одной стороны - это не предсказуемый OpenSource. Например завтра (или послезавтра, одним словом - на днях),
может выясниться, что там нет никаких "указателей по 6 Byte", а просто DLL собрана на совсем других исходниках,
которые забыли выложить и в этой структуре 6 Byte - это просто указатель + два флага byte. И всё ... :)
Хотя, вроде бы, сейчас у меня версия исходников и DLL совпадает - я проверял.

С другой - абсолютно бесплатный проект красиво и элегантно решает все (!) вопросы с различными (!) штрих-кодами.
Действительно решает - я этим давно занимаюсь и знаю где смотреть. До этого много лет пользовался китайской DLL за $159
(покупал), которая делала только QR код и имела массу проблем, в т.ч. её клинило на больших объёмах под Windows10.