Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1396021466
DQ
2014-03-28 19:44
2017.03.26
Использование типов данных "Перечисление" и "Множество"


2-1437985170
Gray-Gray
2015-07-27 11:19
2017.03.26
Ошибки проекта Delphi XE8, creatin VCL Forms Application


2-1437193956
xayam
2015-07-18 07:32
2017.03.26
Delphi XE8 + Android


4-1282048057
mc.fly
2010-08-17 16:27
2017.03.26
Как создать буффер-изображение в памяти? Без VCL.


4-1282284939
Dmitriy
2010-08-20 10:15
2017.03.26
перерисовка надписи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский