Форум: "Начинающим";
Текущий архив: 2017.03.26;
Скачать: [xml.tar.bz2];
ВнизИспользование типов данных "Перечисление" и "Множество" Найти похожие ветки
← →
DQ (2014-03-28 19:44) [0]Пара вопросов.
Вот я объявил:type ZEnum = (z_first, z_second, ..); ZSet = set of ZEnum;
ПосмотрелSizeOf(ZSet)
- он показывает 1 байт. Можно ли заставить его выравнивать до 4-х байт? Временное решение:.. , z_last=31)
Вот я теперь пытаюсь (в Делфи7) проверить:var ZS: ZSet;
..
ZS:=[z_second];
if (z_first in ZS) then showmessage("z_first");
if (z_second in ZS) then showmessage("z_second");
И при Ctrl+Space нет всплывающих окошек с подсказками какие ещё ZEnum бывают, можно как-то поправить чтоб были?
← →
Германн © (2014-03-28 20:13) [1]
> Посмотрел SizeOf(ZSet) - он показывает 1 байт. Можно ли
> заставить его выравнивать до 4-х байт?
А нафига?
← →
DQ (2014-03-28 20:18) [2]Оно должно быть 4 байта ровно, для секретных целей. =)
Временное решение в принципе работает, проверено, лишь жаль мешается лишняя названия.
Меня больше беспокоит что в if (z_second in ZS) не даёт вариантов выбора константы...
← →
Ega23 © (2014-03-28 20:30) [3]
> Оно должно быть 4 байта ровно, для секретных целей. =)
Приводи его к Integer, в чем проблема?
← →
это все... (2014-03-28 20:35) [4]Удалено модератором
← →
это все... (2014-03-28 20:39) [5]Приводи его к Integer, в чем проблема?
наверное в том, что множество - это 32 байт в которых каждый бит отвечает за наличие члена причем важно в какой позиции этот бит
← →
это все... (2014-03-28 20:44) [6]Удалено модератором
← →
DQ (2014-03-28 21:16) [7]Оно просто по плану в юнионе будет жить.
множество - это 32 байт
Насколько я понял множество подстраивает размер под ситуацию? Я сегодня делал множество про которое SizeOf() сказало 9 байт.
нарваться на контроль переполнения при обратном преобразовании в сет + приколы со старшим битом интегера, отвечающим за знак числа
ам... А не можно тут чуть подробнее?
← →
это все... (2014-03-28 21:22) [8]ты доку то хоть открой.
посмотри сколько членов может быть во множестве
раздели это на восемь.
и получишь все подробности
← →
DQ (2014-03-28 21:37) [9]Сколько может быть и сколько реально есть - не одно и то же. Оно выравнивает до большего целого байта. Мне не важно сколько максимум может достигнуть, надо чтоб в SizeOf() было 4 ровно.
Кроме как "in" что ещё может работать с множествами?
← →
это все... (2014-03-28 21:43) [10]в школу ходил?
длина_перечисления_должна_быть_не меньше := succ(pred(4) * 8);
24 члена в перечислимом типе = три байта на хранение хватит
нужно множество длиной четыре байта?
минимум 25 членов
сколько перечислимых членов может быть максимум чтобы множество осталось 4 байта - сам посчитаешь?
← →
Inovet © (2014-03-28 21:48) [11]Так надо выравнивать на границу 4 байт или размер 4 байт?
← →
DVM © (2014-03-28 22:45) [12]
> DQ (28.03.14 21:37) [9]
> Мне не важно сколько максимум может достигнуть, надо чтоб
> в SizeOf() было 4 ровно.
Зачем?
← →
DQ (2014-03-28 23:16) [13]>> [10]
Вы чего ёрничаете? Причём тут "посчитаешь", считаю я не хуже вас. Надо 5 (например) элементов но чтоб 4 байта размер! К тому же в самом первом сообщении показал:type ZEnum = (z_first, z_second, z_last=31);
И всё, пожалуйста! Три элемента, а размер ровно 4! Лишь "лишний" элемент мешается. Просто думал это как-то управляется явно.
>> [11]
В моём понимании это одно и то же. В чём вы видите разницу?
>> [12]
Это я тоже говорил.
← →
Inovet © (2014-03-28 23:30) [14]> [13] DQ (28.03.14 23:16)
> В моём понимании это одно и то же. В чём вы видите разницу?
Приплыли. Поезд выехал из пункта с номером столба 3 и делал остановки возле каждого следующего 4-го столба не одно и то же что - делал остановки возле каждого столба с номером кратным 4.
← →
Германн © (2014-03-28 23:37) [15]Удалено модератором
← →
DVM © (2014-03-28 23:37) [16]
> DQ (28.03.14 23:16) [13]
> Это я тоже говорил.
А, ну да, для секретных целей. Это все объясняет.
← →
DQ (2014-03-28 23:40) [17]ам... Они все от нулевого "едут". И все должны возле каждого 4-го останавливаться. Критично чтоб они спустя час не стали останавливаться у "разных".
← →
DQ (2014-03-28 23:41) [18]Там вообще-то шутка была. Есть такая штука как юмор. =(
← →
Inovet © (2014-03-28 23:45) [19]> [17] DQ (28.03.14 23:40)
> ам... Они все от нулевого "едут". И все должны возле каждого 4-го останавливаться.
Тогда нет проблем с количеством вагонов, лишь бы длина состава была не больше расстояния между 4-мя столбами.
← →
MBo © (2014-03-28 23:51) [20]Перечисления с явно заданными значениями (z_last=31) неполноценно поддерживаются компилятором, например, для них нет RTTI. Видимо, поэтому и подсказок нет.
А минимальный размер перечисления определяется директивой компилятора $MinEnumSize ($Z)
← →
DQ (2014-03-28 23:54) [21]Представьте воображаемые "составы" в 4-хмерном пространстве, которые в параллельных измерениях едут в одном и том же месте одновременно, пересекаясь своими координатами и объёмами.
Нужно что бы вагон типа ZSet вцепленный в Packed Record занимал 4 байта ровно, а то разъедутся мимо.
Ладно... А всё же почему это:ZS:=[
плюс Ctrl+Space показывает перечисления, а там где "in" ничего не показывает вообще?
← →
DQ (2014-03-28 23:55) [22]ой.. Пока печатал.. Спасибо! Будем изучать. Что-то, а с директивами компилятора у меня большой пробел.
← →
Inovet © (2014-03-29 00:00) [23]> [21] DQ (28.03.14 23:54)
В параллельных измерениях они и так разехавшиеся, в проекции могут и пересекаться, но это не должно волновать, путь компилятор им выделит в пространстве нужные координаты.
Снова XYZ, на днях только было.
← →
Inovet © (2014-03-29 00:00) [24]> [22] DQ (28.03.14 23:55)
> Что-то, а с директивами компилятора у меня большой пробел.
Там же и про выравнивание есть.
← →
DVM © (2014-03-29 00:13) [25]А причем тут вообще размер перечисления.
← →
DQ (2014-03-29 00:20) [26]В том-то и фокус - они не разъехавшиеся. Они в юнионе, говорил же. Точнее будут не такими сякими если SizeOf(ZSet)=4.
У меня нету XYZ, у меня поиск нового подхода к древней задаче. Просто практически не пользовал раньше "Перечисление" и "Множество".
Пытаюсь переложить кучу логики, промежуточных переменных и принудительных приведениев типов с кода на уровень хитрого описания типа данных.
Не получится - ну просто вернусь к подходу которому около 15 лет, только DWORD, только хардкор. А вот если получится - будет сверхудобная штука.
← →
Inovet © (2014-03-29 00:53) [27]> [26] DQ (29.03.14 00:20)
Ну допустим наложить множество на DWORD? так зачем ровно 4 байта делать, пусть меньше будет, главное чтобы начало было выровнено, а это уже компилятор будет выравнивать при соответсвующем указании - что на что накладывать.
← →
Герменн (2014-03-29 01:00) [28]Удалено модератором
← →
Герменн (2014-03-29 01:03) [29]Удалено модератором
← →
Германн © (2014-03-29 01:05) [30]Удалено модератором
← →
Inovet © (2014-03-29 01:28) [31]Кстати, насколько там нормировано и как зависит от директив расположение бит, чтобы его так вот в юнионе использовать, а то придётся жёстко задавать.
← →
Inovet © (2014-03-29 01:31) [32]> [30] Германн © (29.03.14 01:05)
> Пардон. Установил новую ОС.
ОС... У меня вон, пока тут отвечал, на ровном месте полезла AV в функции из двух строчек, нулевой указатель внезапно стал передаваться. Спать надо.
← →
DQ (2014-03-29 01:40) [33]Не было секрета, вообще-то я ещё в [7] об этом написал.
У меня нет проблем. Меня не устраивают сами штатные способы, их я знаю наизусть (хотя не уверен что именно вы подразумевали этим термином). Просто пытаюсь переписать давно готовый код, чтоб стало прозрачнее, короче и удобнее для человека (плюс упрощая читаемость, поддержку и доработку). Монстры у меня только в описании структурных типов данных. А в секции реализации всё как раз очищается от лишнего. Иногда просто удобно переписав тип данных избавляешься от десятков Shr/Shl.
Inovet, просто там не всё по 4 байта. Без Packed он в одном месте не так выравнивает, а с Packed всё кроме этого SetOf нормально. Попробовать обернуть множество и блок в 4 байта в ещё один юнион? хм...
Кстати $MinEnumSize не действует на SetOf вообще никак. =(
← →
Inovet © (2014-03-29 01:42) [34]> [33] DQ (29.03.14 01:40)
> Попробовать обернуть множество и блок в 4 байта в ещё один юнион?
Ну да, так и надо. Только как там насчёт предыдущего поста?
← →
DQ (2014-03-29 01:46) [35]Предыдущего? Про надо спать? =)
Конечно надо! Добрых снов! Завтра выходной, всем выспаться!
Сделаю завтра, потестирую... Будет видно.
← →
Inovet © (2014-03-29 02:11) [36]> [35] DQ (29.03.14 01:46)
> Предыдущего? Про надо спать?
Это тоже надо, но я про [31].
← →
Германн © (2014-03-29 02:24) [37]Удалено модератором
← →
Германн © (2014-03-29 02:26) [38]Удалено модератором
← →
это все... (2014-03-29 13:11) [39]А причем тут вообще размер перечисления.
да при том при самом размер перечисления тут.
← →
DQ (2014-03-29 16:06) [40]Всё у меня достаточно. Когда придумывали ООП полюбому тоже кто-то ворчал мол выдумываете монстров потому что базовых знаний процедурного программирования недостаточно. Всегда есть куда совершенствовать.
>> Вот так бы и сказал. И привел бы тот "готовый код" и сказал бы что тебя в нём не устраивает.
Откройте тот же MSDN, любой проект из Windows SDK Examples. Мне прекрасно всё понятно. Но хочу сделать иначе чтоб было лучше.
>> но я про [31].
Не могу ответить. Надо думать.
← →
Германн © (2014-03-30 02:48) [41]Удалено модератором
← →
Сергей (2015-07-24 07:13) [42]Так как повлиять на размер set of enum?
← →
кгшзх © (2015-07-24 08:35) [43]> Мне не важно сколько максимум может достигнуть, надо чтоб
> в SizeOf() было 4 ровно.
А мне надо чтобы SizeOf(Char) было ровно 1966
И что делать если чар это байт, а множество это 256 бит?
← →
icWasya © (2015-07-24 09:10) [44]
procedure Include( var S: set of T; X: T );
procedure Exclude( var S: set of T; X: T );
← →
Сергей (2015-07-24 10:16) [45]Хочу множество в функцию передать. А функция хочет Cardinal.
← →
кгшзх © (2015-07-24 12:10) [46]хочу анжолину жоли, а анжолина хочет бредапита
← →
Сергей (2015-07-24 12:15) [47]То что вы пишете не имеет смысла. Флуд какой-то.
Вы либо знаете как сделать, либо нет. Видимо не знаете? Чего тогда вообще писать? =/
← →
кгшзх © (2015-07-24 12:24) [48]смысл ровно такой же как и у тебя.
"хочу передать множество туда где ждут кардинал" = "хочу анжолину жоли, но анжолина хочет бредапита"
хотеть не смертельно в обоих случаях. хоти на здоровье.
← →
Сергей (2015-07-24 18:03) [49]Читайте как "требуется". В классах есть read-only property, которые возвращают Set Of TEnum***.
Есть функция экспортированная из DLL, принимающая одним из входящих Cardinal. Требуется передавать туда эти property.
У одного класса SizeOf(property)=4. И прекрасно работает через Integer(AnObject.property)
У другого класса SizeOf(property)=1. У третьего SizeOf(property)=2. И тогда выдаёт "[Error] Invalid typecast". Как мне сделать typecast?
Нашёл эту тему, пробовал как описано со своим множеством - сработало как должно. Да только не могу влезть в объявление типа и добавить "z_last=31".
← →
Rouse_ © (2015-07-25 17:55) [50]Абсолютно верно, памятью, выделенной под множество, нужно управлять количеством бит, с которыми оно оперирует, поэтому для 4 байт нужно последнму элементу выставить z_last = 31
← →
Rouse_ © (2015-07-25 17:57) [51]Как вариант, можно делать стриминг сета и передавать его, тогда обойдещь проблему с размерностью
← →
кгшзх © (2015-07-26 15:14) [52]а еще если выбирать типы не от балды, то проблем лишних не будет.
если все влезает в dword, и если в функцию надо передавать 4 байта, то и хранить надо в дворде.
← →
Сергей (2015-07-28 09:57) [53]Вы невнимательно читали - типы выбирал не я.
Что-то не смог нагуглить термин "стриминг сета/множества"... Что вы имели ввиду?
← →
кгшзх © (2015-07-28 10:32) [54]Вы невнимательно читали - типы выбирал не я.
Вот я объявил:
type ZEnum = (z_first, z_second, ..); ZSet = set of ZEnum;
ага, я понял.
множество выбирала левая нога.
← →
Сергей (2015-07-28 11:12) [55]Очень, очень невнимательно. Это не мой пост. =/
← →
хзшгк (2015-07-28 11:52) [56]так мой пост не мой
← →
Игорь Шевченко © (2015-07-28 17:16) [57]
> Это не мой пост
А зачем ты в чужой ветке создаешь свои посты ? Создай свою ветку.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.03.26;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.002 c