|
|
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Доброй ночи! Подскажите пожалуйста, а как передаются типы данных перечисление и множество и можно ли на это как-то повлиять? Условный пример. Допустим имеется процедура: Код: pascal 1. Есть люди, которые хотят вызывать её из своих "богомерзких плюсов" C++. Но как им объявлять заголовок? Точнее - второй и четвёртый параметры функции (учитывая что при изменении количества элементов в TTypeKind размеры обеих переменых могут меняться)? Я не собираюсь менять нужный мне тип из-за кого-то там - во-первых мне просто нет необходимости это делать (пользы не будет, наоборот станет хуже) моему коду безразлично как они передаются, во-вторых даже если стану править то на рефакторинг потрачу месяцы. Крутить "обёртки/переходники" мне тоже некогда, да и система слишком большая. Но если бы было достаточно просто добавить какие-нибудь директивы вроде $MinEnumSize или stdcall - я бы уж потратил час/два чтоб их расставить, так уж и быть. Люди сильно просят - и я (хоть и не особо заинтересован в их "удобстве", я вообще был против сования рук со стороны в мою систему) согласился рассмотреть есть ли возможность что-то для них подправить. Их бы устроило что-то вроде: Код: plaintext 1. Иными словами надо чтоб параметры #2 и #4 были грубо говоря "по смещению" 4 и 12. А в справке пишут: Sets, records, and static arrays of 1, 2, or 4 bytes are passed as 8-bit, 16-bit, and 32bit values. Вывод - передаётся не так как хотели бы люди (и плюс не совсем понятно что будет при передаче трёхбайтового множества). А можно ли принудительно заставить всегда быть 32bit? Был совет использовать для перечисления директиву {$MINENUMSIZE 4} (в принципе подходит и работает), а для множества добавлять в перечисление холостой элемент с явным указанием значения в 31. Но последнее хоть и даёт нужный эффект, но лишает перечисление генерации type info , что к сожалению в моём случае никак не подходит. P.S. Насколько я протестировал - все мои типы не превышают 4 байта, так что ситуацию с превышением можно опустить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 00:00 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Чародей Ученика, А на что ты готов пойти ради совместимости? Например, в таком виде в 32-разрядных Windows функцию произвольные сишники не вызовут - им нужно общеизвестное соглашение о вызове - stdcall или cdecl. (В Win64 соглашение о вызове единое). Так что тебе уже, скорее всего, придётся модифицировать код. Далее - хорошо бы знать сценарий использования, и что может из себя представлять TTypeKind ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 09:35 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Передавайте не множество, а битовую маску. Если элементами множества могут быть только 32 элемента, то хватит DWORD ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 11:04 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Чародей УченикаЯ не собираюсь менять нужный мне тип из-за кого-то там - во-первых мне просто нет необходимости это делать (пользы не будет, наоборот станет хуже) моему коду безразлично как они передаются, во-вторых даже если стану править то на рефакторинг потрачу месяцы. OK, забываем про плюсы и рассматриваем ситуацию в общем. Что произойдет с программой, написанной на самых каноничных дельфях, если в используемой ей dll внезапно поменялся размер параметра? Правильно, сначала улетит в космос, потом упадет. И кое-кто заслуженно огребет. Вывод - плюсы тут совершенно не причем, при взаимодействии бинарников размеры должны быть фиксированными всегда. Чародей УченикаНо последнее хоть и даёт нужный эффект, но лишает перечисление генерации type info , что к сожалению в моём случае никак не подходит. Очень даже подходит, Просто нужно использовать подтипы. Вроде Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 11:08 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Чародей УченикаНо последнее хоть и даёт нужный эффект, но лишает перечисление генерации type info , что к сожалению в моём случае никак не подходит. Вообще ты можешь сам посчитать сколько занимает множество, не обязательно задавать руками планку в 31, просто подсчитай размер перечисления и его используй. Если у тебя 8 значений в TTypeKind то у перечисления размер будет байт, и вообще размер = (<кол-во элементов> + 7) div 8. Это если у тебя элементы автоматически нумеруются. Проблема будет только когда ты будешь расширять перечисление, то нужно проверять размер множества, а если ты сразу задашь 31, то размер всегда будет dword. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 12:54 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Размеры типов не динамические, а определяются на этапе компиляции. Следовательно, делаешь экспортируемую функцию GetEnumSize = SizeOf(TTypeKind), а сишники делают так (псевдокодом) typedef PasEnum int16 // (к примеру) определено эмпирически вызовом того же GetEnumSize из текущего Delphi бинарника if SizeOf(PasEnum) <> GetEnumSize throw Error('Размер отличается от ожидаемого') ну и потом вызывают функцию PasEnum TypeKind = 2; AddTypeKind(.. , TypeKind, ..) а множества соответственно генерят как битовую маску, тоже с проверкой размера. В этом случае в твоем коде даже не надо ничего переделывать, кроме добавления одной функции, только помнить, что перетасовывать значения внутри TTypeKind уже надо с оглядкой на других. Если размер типа изменится, то старая версия программы при попытке подключиться к новой DLL выкинет ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 14:47 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Соглашение о вызове "cdecl" - аргументы, размер которых меньше 4-х байт, расширяются до 4-х байт .Оно? А про "stdcall" сходу не нашёл, но помнится там что-то также расширялось или выравнивалось, можно и его опробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 15:41 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
В С++ размер перечислимого типа 4 байта.. В Delphi по умолчанию 1 байт.. но это решается {$MINENUMSIZE 4} А также для структур {$ALIGN ON} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 17:08 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
X-CiteВ С++ размер перечислимого типа 4 байта..С какого перепугу? Он совместим с типом int а вот размер может зависеть от реализации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 17:19 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
зондСоглашение о вызове "cdecl" - аргументы, размер которых меньше 4-х байт, расширяются до 4-х байт .Оно? Это при любом соглашении в 32-х битных программах. Аналогично, в 64-битных расширяются до 64 бит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 19:04 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
schi, Так-то оно так, но это влияет только на передачу параметров. А вот использоваться будет не все 32 бита, и при отправке $100 в 1 байтное множества будет расцениваться принимающей программой как 0, т.е. [], из-за этого не будет возможным проверить правильность получаемых данных. Потому в описании функции стоит указывать верный размер, дабы уже на вызывающей стороне можно было проверить хотя бы выход за границы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 19:13 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Чародей Ученика, что насчет множеств, можно передавать по идее в любом виде (хоть массива), но на другой стороне сделать обертку, переводящую в родной формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 19:39 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
schiЭто при любом соглашении в 32-х битных программах. Аналогично, в 64-битных расширяются до 64 бит. Не-а. При "register/fastcall" байт передаётся в AL/DL а слово в AX/DX - остальное будет с мусором. Да и в стеке тоже будет в виде 8/16 бит + мусор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2018, 23:51 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
MBoА на что ты готов пойти ради совместимости?Я уже написал - на мелкие правки вроде добавления директив, например. Соколинский БорисПросто нужно использовать подтипы. Вроде Код: pascal 1. 2. 3. 4. 5. Может у вас версия Делфи какая-то более современная, но а у меня:[dcc32 Error] : E2004 Identifier redeclared: 'I0' 527470Вообще ты можешь сам посчитать сколько занимает множество, не обязательно задавать руками планку в 31, просто подсчитай размер перечисления и его используй.Мне не требуется считать, задавать планку, знать размер. Это некоторые люди просят "задать планку". Мне-то всё равно, а у них неудобства. Если им можно помочь без доп.разработок - то почему бы и нет? Василий 2В этом случае ...Спасибо, возможно сделаем как запасной вариант. X-Citeно это решается {$MINENUMSIZE 4}У меня в первом посте уже есть про это, решает задачу но частично - не влияет на Set. И вообще даже просто по логике - если есть $MinEnumSize, почему нету $MinSetSize? Недоработка)) зондОно? ... можно и его опробовать.Благодарю, попробую указать как cdecl! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 11:28 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Чародей УченикаМожет у вас версия Делфи какая-то более современная, но а у меня:[dcc32 Error] : E2004 Identifier redeclared: 'I0' Проблема не в клозетах, а в головах в версии дельфей. Когда понимаешь о чем речь, ошибки синтаксиса исправляются самостоятельно. Код: pascal 1. 2. 3. 4. Тип TItemsInt используется во внутренних операциях, TItemsExt - во внешних. Компилятор сам сделает нужные преобразования размеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 11:54 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
гм... "Перечисление", "имена элементов", "скобки"... Последнее показалось логичным и не лишним... А оно уже не как имена, а как константы, ясно. Хоть при попытке присвоить TItemInt неподдерживаемый (отсутствующий) элемент получаю:[dcc32 Error] : E1012 Constant expression violates subrange boundsно при добавлении в TItemsInt неподдерживаемого (отсутствующего) элемента - не добавляет, но совершенно молча. Плюс в Code Completion отображаются все лишние, "дырявым" не сделать, а у TItemInt - no type info. Подход действительно интересный, спасибо, но в моём случае судя по всему не подойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2018, 13:02 |
|
||
|
Как передаются типы данных перечисление и множество и можно ли на это как-то повлиять?
|
|||
|---|---|---|---|
|
#18+
Чародей УченикаМне не требуется считать, задавать планку, знать размер. Это некоторые люди просят "задать планку". Мне-то всё равно, а у них неудобства. Если им можно помочь без доп.разработок - то почему бы и нет? Так и задаёте планку, один раз посчитайте размер и скажите им какой он у вас. Какие ещё доп. разработки? В моём варианте решения, у вас не изменится ни одной строчки кода на делфи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2018, 12:26 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39673321&tid=2040621]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
222ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 557ms |

| 0 / 0 |
