Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.03.26;
Скачать: CL | DM;

Вниз

Использование типов данных "Перечисление" и "Множество"   Найти похожие ветки 

 
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].

Не могу ответить. Надо думать.



Страницы: 1 2 вся ветка

Текущий архив: 2017.03.26;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.007 c
4-1282284939
Dmitriy
2010-08-20 10:15
2017.03.26
перерисовка надписи


15-1459185260
d2pak
2016-03-28 20:14
2017.03.26
Организация буфера видео потока


15-1458782603
Kilkennycat
2016-03-24 04:23
2017.03.26
Защита прав потребителя


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


2-1437734169
Koko-239
2015-07-24 13:36
2017.03.26
Описание ПК