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

Clarion, Clarion 7

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

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

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

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

Привет всем ! :)

Мне нужно передать во внешнюю 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 ?! :(
Заранее спасибо за помощь, потому как это совсем тупик моих знаний. :(
«V» значит Вендетта !
kreator
✯ Ветеран ✯
Сообщения: 4132
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator »

Указатели - это LONG в чистом виде. В 64-битных, возможно, два LONG. Может от этого защита. От дурака. А что в приведённой структуре?
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1162
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL »

Возможно, дело в выравнивании
https://forum.clarionlife.net/viewtopic.php?f=5&t=4072
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1162
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL »

P.S. Вероятно правильно будет CString(11) все-таки либо String(10)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5231
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

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

kreator писал(а): 05 Апрель 2021, 17:28 Указатели - это LONG в чистом виде.
Тоже так думал первую половину дня. :)
Здесь ещё надо учитывать, что это бесплатный OpenSource - а его пишут как письмо дяде Фёдору из Простоквашино. ;)
Последний раз редактировалось Игорь Столяров 05 Апрель 2021, 18:46, всего редактировалось 1 раз.
«V» значит Вендетта !
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5231
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

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

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
«V» значит Вендетта !
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1162
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL »

Игорь Столяров писал(а): 05 Апрель 2021, 18:44 Но непонятно почему
Так я же дал ссылку, почему...
Думаю, надо не подгонять методом тыка, а разобраться, как правильно
А что в эти поля в итоге присваивается?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5231
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

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

RaFaeL писал(а): 05 Апрель 2021, 19:06 А что в эти поля в итоге присваивается?
В сами поля fgcolour / bgcolour записывается цвет кода/фона в виде текста "FFFFFF" и т.д.
Судя по любезно оставленному неизвестным автором комментария - добавили ссылки на поля с цветом - см. первое сообщение.
Как они используются, в каком формате, что в них пишет DLL - я не знаю и надеюсь, что не узнаю. :)
«V» значит Вендетта !
kreator
✯ Ветеран ✯
Сообщения: 4132
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator »

Игорь Столяров писал(а): 05 Апрель 2021, 19:14 В сами поля fgcolour / bgcolour записывается цвет кода/фона в виде текста "FFFFFF" и т.д.
Ну шесть символов! А десять зачем? На будущее?
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1162
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL »

Ну т.е. поля указателей не используются, а используется только 2 раза по 6 байт, с 1 по 6 и с 17 по 22, так? Тогда можно оставить все как есть Но про выравнивание все-таки почитайте
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5231
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

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

kreator писал(а): 05 Апрель 2021, 19:36 Ну шесть символов! А десять зачем? На будущее?
Можно только догадываться ... :)
Вскрыл исходники - там описание структуры на сях, которую нужно передать в DLL.
Почему в ней цвет кодируется в 10-ти символах ? ХЗ. Почему явно указатель занимает 6 Byte ? ХЗ ... :)
«V» значит Вендетта !
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1162
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL »

Игорь Столяров писал(а): 05 Апрель 2021, 19:54 Почему явно указатель занимает 6 Byte ?
Указатель занимает 4 байта, еще 2 байта не занимает ничего, просто вам надо 3й параметр расположить с начиная байта, кратного длине Long (если с 0 считать то это 16й байт, ну или 17й если с 1)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5231
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

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

RaFaeL писал(а): 05 Апрель 2021, 20:23 еще 2 байта не занимает ничего
Это то, к чему я пришёл методом тыка.
Меня больше интересует почему то, что в тексте на сях "char *fgcolor;" переводится на Clarion
как "4 Byte на указатель + 2 Byte в которых нет ничего". Вот вопрос в чём ... :)
«V» значит Вендетта !
kreator
✯ Ветеран ✯
Сообщения: 4132
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator »

RaFaeL писал(а): 05 Апрель 2021, 20:23
Игорь Столяров писал(а): 05 Апрель 2021, 19:54 Почему явно указатель занимает 6 Byte ?
Указатель занимает 4 байта, еще 2 байта не занимает ничего, просто вам надо 3й параметр расположить с начиная байта, кратного длине Long (если с 0 считать то это 16й байт, ну или 17й если с 1)
Я понял. Чума. Сишники с ума сошли?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5231
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

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

С этим проектом (ZINT) смешанные чувства.

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

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