Страница 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
Совместимость типов данных
Добавлено: 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)
Спасибо ! Я выбрал вот такой вариант, с ним всё работает как часы. Но непонятно почему.
Код: Выделить всё
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, 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.