![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование типов данных "Перечисление" и "Множество" [D7, XP]
DQ © (2014-03-28 19:44:00)Пара вопросов.
Вот я объявил:
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-29 02:24:00) [21]Удалено модератором
Inovet (2014-03-29 02:11:00) [22]> [35] DQ (29.03.14 01:46)
> Предыдущего? Про надо спать?
Это тоже надо, но я про [31].
DQ (2014-03-29 01:46:00) [23]Предыдущего? Про надо спать? =)
Конечно надо! Добрых снов! Завтра выходной, всем выспаться!
Сделаю завтра, потестирую... Будет видно.
Inovet (2014-03-29 01:42:00) [24]> [33] DQ (29.03.14 01:40)
> Попробовать обернуть множество и блок в 4 байта в ещё один юнион?
Ну да, так и надо. Только как там насчёт предыдущего поста?
DQ (2014-03-29 01:40:00) [25]Не было секрета, вообще-то я ещё в [7] об этом написал.
У меня нет проблем. Меня не устраивают сами штатные способы, их я знаю наизусть (хотя не уверен что именно вы подразумевали этим термином). Просто пытаюсь переписать давно готовый код, чтоб стало прозрачнее, короче и удобнее для человека (плюс упрощая читаемость, поддержку и доработку). Монстры у меня только в описании структурных типов данных. А в секции реализации всё как раз очищается от лишнего. Иногда просто удобно переписав тип данных избавляешься от десятков Shr/Shl.
Inovet, просто там не всё по 4 байта. Без Packed он в одном месте не так выравнивает, а с Packed всё кроме этого SetOf нормально. Попробовать обернуть множество и блок в 4 байта в ещё один юнион? хм...
Кстати $MinEnumSize не действует на SetOf вообще никак. =(
Inovet (2014-03-29 01:31:00) [26]> [30] Германн © (29.03.14 01:05)
> Пардон. Установил новую ОС.
ОС... У меня вон, пока тут отвечал, на ровном месте полезла AV в функции из двух строчек, нулевой указатель внезапно стал передаваться. Спать надо.
Inovet (2014-03-29 01:28:00) [27]Кстати, насколько там нормировано и как зависит от директив расположение бит, чтобы его так вот в юнионе использовать, а то придётся жёстко задавать.
Германн (2014-03-29 01:05:00) [28]Удалено модератором
Герменн (2014-03-29 01:03:00) [29]Удалено модератором
Герменн (2014-03-29 01:00:00) [30]Удалено модератором
Inovet (2014-03-29 00:53:00) [31]> [26] DQ (29.03.14 00:20)
Ну допустим наложить множество на DWORD? так зачем ровно 4 байта делать, пусть меньше будет, главное чтобы начало было выровнено, а это уже компилятор будет выравнивать при соответсвующем указании - что на что накладывать.
DQ (2014-03-29 00:20:00) [32]В том-то и фокус - они не разъехавшиеся. Они в юнионе, говорил же. Точнее будут не такими сякими если SizeOf(ZSet)=4.
У меня нету XYZ, у меня поиск нового подхода к древней задаче. Просто практически не пользовал раньше "Перечисление" и "Множество".
Пытаюсь переложить кучу логики, промежуточных переменных и принудительных приведениев типов с кода на уровень хитрого описания типа данных.
Не получится - ну просто вернусь к подходу которому около 15 лет, только DWORD, только хардкор. А вот если получится - будет сверхудобная штука.
DVM (2014-03-29 00:13:00) [33]А причем тут вообще размер перечисления.
Inovet (2014-03-29 00:00:00) [34]> [22] DQ (28.03.14 23:55)
> Что-то, а с директивами компилятора у меня большой пробел.
Там же и про выравнивание есть.
Inovet (2014-03-29 00:00:00) [35]> [21] DQ (28.03.14 23:54)
В параллельных измерениях они и так разехавшиеся, в проекции могут и пересекаться, но это не должно волновать, путь компилятор им выделит в пространстве нужные координаты.
Снова XYZ, на днях только было.
DQ (2014-03-28 23:55:00) [36]ой.. Пока печатал.. Спасибо! Будем изучать. Что-то, а с директивами компилятора у меня большой пробел.
DQ (2014-03-28 23:54:00) [37]Представьте воображаемые "составы" в 4-хмерном пространстве, которые в параллельных измерениях едут в одном и том же месте одновременно, пересекаясь своими координатами и объёмами.
Нужно что бы вагон типа ZSet вцепленный в Packed Record занимал 4 байта ровно, а то разъедутся мимо.
Ладно... А всё же почему это:ZS:=[плюс Ctrl+Space показывает перечисления, а там где "in" ничего не показывает вообще?
MBo (2014-03-28 23:51:00) [38]Перечисления с явно заданными значениями (z_last=31) неполноценно поддерживаются компилятором, например, для них нет RTTI. Видимо, поэтому и подсказок нет.
А минимальный размер перечисления определяется директивой компилятора $MinEnumSize ($Z)
Inovet (2014-03-28 23:45:00) [39]> [17] DQ (28.03.14 23:40)
> ам... Они все от нулевого "едут". И все должны возле каждого 4-го останавливаться.
Тогда нет проблем с количеством вагонов, лишь бы длина состава была не больше расстояния между 4-мя столбами.
DQ (2014-03-28 23:41:00) [40]Там вообще-то шутка была. Есть такая штука как юмор. =(