![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
есть маски
они приходят в любой комбинации. Но маска "а", должна исключать маски "b" и "с". То есть, если пришла "a", то "b" и "c" должны сброситься, или если пришла "b" или "c". то должна сброситься "a". Можно ли их как организовать, чтоб при побитовом сложении осуществлялось это исключение. Или только руками проверять ? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
enum ![]() Ничего не понял, что требуется. Присваивайте значение пришедшей маски, и предыдущее значение сбросится. |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Как я понял у Вас есть переменная которая должна быть равна значению одной маски, а не их сочетанию. Ну так присваивайте нужное значение и все. Или вопрос в чем то другом ? тогда перефразируйте плиз, чтоб можно было понять, чтоб Вам требуется. Можно попробовать подкрепить вопрос примером. ![]() Это сообщение отредактировал(а) mes - 30.4.2009, 23:22 |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну полностью задачу, так и не хотите осветить. Можно например 1. чтоб маска A включала в себя маски B и C, логичнее сказать для задачи использовать не { А, B, C }, а { ABC, B, C } 2. завести дополнительно исключающие маски :
тогда установка битов по маске будет провoдиться в два действия.
кстати выражение "пришла маска" имхо, не очень удачнoe, так как сама маска никуда не ходит, она сидит себе тихо и проверяет пришедшие значения на нужное сочетание битов. ![]() Это сообщение отредактировал(а) mes - 1.5.2009, 20:03 |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Добавлено через 6 минут и 24 секунды Если disables сделать обычным (нестатичным), правила запретов можно менять динамически для каждого экземпляра |
|||
|
||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
ну смысл такой. Есть генератор файлов. Он поставляет файлы различных типов - либо они архивированные - либо нет. Но в один момент времени он поставляет файлы одного типа. Также в процессе работы он может поменять тип генерируемых файлов. 1. Неизвестный тип 2. Файл открыт 3. Файл архивирован 3.1. Архивирован Неизвестным архиватором 3.1. Zip 3.3. Rar Задача - описать генератор файлов. Сложность в том, что их одного файла определить этого нельзя. Нужно накапливать свойства. Усложняется еще и тем, что для пользователя Zip и Rar это схожие архиваторы (можно разархивировать одним приложением), но типы эти разные. То есть Zip дополняет Rar. Также можно определить, что файл архивирован, но непонятно чем. У меня получились следующие маски
и при получении файла осуществляется проверка
1. Если поставлялись закрытые файлы и пришел открытый, то просто меняется тип на OPEN 2. Если поставлялись открытые файлы и пришел закрытый, то сбрасывается флаг OPEN и взводится тип ARCHIVE. Если же известен тип архивации, то побитовая сумма. Вся сложность в том, что Rar и Zip могут быть вместе, но XXX с ними не должен быть. То есть возможные ситуации 1. XXX 2. Zip 3. Rar 4. Zip & Rar Но вот если поставлялись файлы XXX и вдруг пожли Zip или Rar, то может получиться ток 1. XXX & Zip 2. XXX & Rar 3. XXX & Zip & Rar что неправильно. Вывод: 1. Хотелось бы избавиться от операций проверки и ограничиться лишь побитовыми операциями. 2. Для этого нужно как-то организовать исключающие маски. З.Ы. И можно ли это вообще сделать без проверок ? Добавлено через 4 минуты и 2 секунды math64, что-то не понял как это решает мою задачу ? |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Твою задачу это не решает, она сложнее.
Можно сделать так:
|
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
можно если не создавать самому себе проблем ![]()
а может у пользователя вобще не будет WinRara, или такая версия которая любой архив одинаково легко раскроет ![]() А так как файл не знает ничего о приложении которое его будет открывать, он должен хранить только тип алгоритма. (т.е никаких сдвоенных масок) чтоб долго словами не объяснять, вот условный код того, как я вижу решение :
Это сообщение отредактировал(а) mes - 1.5.2009, 14:16 |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Да, с классами код будет понятнее.
|
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
я лишь привел надуманный пример. Задача ставится именно для сдвоенных масок. Добавлено @ 14:21 необходимо различать типы xxx rar zip zip & rar Добавлено @ 14:22 xxx к тому же исключающий zip и rar Это сообщение отредактировал(а) zss - 1.5.2009, 14:22 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Если считатете, что тут сидят телепаты Вы ошибаетесь (по крайней мере я пока таких не встречал), и если надеетесь получить ответ от кого нибудь из форумчан, то проявите усердие и поставьте задачу ясно. Тут идет вопрос не о программисте или заказачике и не об их личных данных ![]() |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
задача была поставлена четко. Есть тип А, B и C. B и C могут существовать вместе как побитовая сумма, а А нет. Причем А исключает существование В и С. Необходимо реализовать это исключение битовыми операциями. Вроде все понятно. А пример приводился для наглядности (я уже пожалел, что его привел ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Наверно это : есть три константы, каждая из которых представлена одним битом.
тут вроде понятно. Т.е есть битовый набор который может принимать только определенные комбинации. А вот тут абсолютно непонятно. Вот есть число n. Как именно с ним реализовать это исключение ? ![]() Наверно имелось ввиду, что при добавлении битовой констаты к набору(т.е при операции OR), исключающие биты должны обнулиться ? В таком случае ответ был дан еще тут : http://forum.vingrad.ru/index.php?showtopi...t&p=1857621 Это сообщение отредактировал(а) mes - 1.5.2009, 17:04 |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну так подходит решение или нет ?
если нет, то чего в нем не хватает ? Добавлено через 4 минуты и 51 секунду А понял что Вам надо.. сейчас Это сообщение отредактировал(а) mes - 1.5.2009, 17:28 |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот опять условным кодом:
исправлено так пойдет ? Это сообщение отредактировал(а) mes - 1.5.2009, 19:43 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Выбирай из трёх вариантов:
1. Пиши ifы, как собирался сам. 2. Составляй таблицу Rule rules[], как предлагал я. Возможно struct Rule будет сложнее, для хранения их можно выбрать какой нибудь контейнер stl, который позволит быстрее найти нужную/-ые запись/-и. 3. Пиши набор классов Archivator, как предложил mes. 4. ЭКЗОТИКА: Выбрать другой язык программирования типа LISP или Prolog или запрограммировать ПЛМ. Врядли можно придумать что-то ещё. IMHO, вариант mes лучше |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
из за написания на скорую руку, код содержал глюки - вот подправил А так применять нельзя, так как eB это не маска, а значение типа. Чтоб можно было за раз устанавливать оба бита, то можете добавить в список тип eBC с необходимыми масками. К тому же приведенный код лишь демонстрация и для заключительной версии требует доработки ![]() Добавлено через 5 минут и 25 секунд это тоже неправильное примение, так как как присваиваете набору значение типа.. Добавлено через 6 минут и 54 секунды Поэтому лучше подобные вещи разгружать через типы, а не значения. Тогда можно будет определить те операции которые требуется и компилятор сам будет следить за коректностью. Это сообщение отредактировал(а) mes - 1.5.2009, 19:49 |
|||
|
||||
math64 |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
По коду mes (1.5.2009, 17:51)
Так нельзя, eВ и eC - номера битов, их нельзя оъбединять по или
или
Добавлено через 14 минут и 27 секунд Вот тебе код без if:
Это сообщение отредактировал(а) math64 - 1.5.2009, 19:59 |
||||||||||||
|
|||||||||||||
KEHT |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 17.7.2006 Репутация: нет Всего: 1 |
Минус реализации, что если тебе нужно будет, чтобы A = 00000001 B = 00000010 C = 00000011 С замещала B, то придеца указать B запрещающую маску 00000011, а это приведет к блокированию A Как вариант использовать vector<T>(или другой контейнер) для хранения масок |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Идея неплохая, но в реализации operator |= и operator | есть ошибки, нужно вычислять новую disallowed_mask и mask вычисляется не всегда правильно.
Можно добавить friend T operator |(const T&, const Mask&); чтобы искючить ненужное вычисление disallowed_mask. |
|||
|
||||
KEHT |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 17.7.2006 Репутация: нет Всего: 1 |
Я исходил из условия задачи, в котором следовало, что объект справа от оператора подается на вход левому, поэтому и disallowed_mask оставлял от левого объекта.
Тут да. В данной реализации к типу T предъявляются довольно существенные ограничения. Идеально было бы хранить контейнер со всем запрещенными масками.
Я так понял, что по условию задачи левый от оператора объект предъявляет требования к правому, поэтому скорее friend T operator |(const Mask&, const T&); Это сообщение отредактировал(а) KEHT - 4.5.2009, 14:05 |
||||||
|
|||||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
|
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
J0ker, и как их пользовать ?
|
|||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
Это сообщение отредактировал(а) J0ker - 4.5.2009, 19:28 |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
zss, ловите идею, может пригодится :
блок с 13й по 26ю строку можно записать примерно так :
подправлено забытое, в связи с замечанием J0ker'а Это сообщение отредактировал(а) mes - 4.5.2009, 21:22 |
||||
|
|||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
6: #undef DECLARE_TYPE
|
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
J0ker, идея хорошая, только у тебя нет исключающего архива.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
с соответствующими упрощениями TypeSet. |
|||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
то есть? все комбинации в моем варианте заведомо верны или вы это имели ввиду:
Это сообщение отредактировал(а) J0ker - 5.5.2009, 09:09 |
||||
|
|||||
Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
Позвольте вопрос...
Ведь если файл zip, rar или unknown_archive - он ведь все равно архив... Это сообщение отредактировал(а) Static - 5.5.2009, 14:21 --------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
ну как-же нет ARCHIVE |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
ARCHIVE с учетом не выставленных ZIP и RAR говорит об этом совершенно прямолинейно |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
для этого к флагам прилагаются функции можно засунуть все это в класс от битовых флагов в чистом виде такого поведения добиться невозможно |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
А теперь, какая самая простая реализация Set<Bit>? int (или short, unsigned char...). А Map<Bit, Set<Bits> >? int[Other+1].
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |