Вопрос по switch - case
От: WiseAlex Беларусь  
Дата: 12.10.03 05:51
Оценка:
while(){
...
switch(a)
{
case c1:...
break;
case c2:...
break;
...
default:
}

}
rem a имеет тип enum

суть в следующем:
некоторые варианты в switch являются обязательными (т.е. необходимо что бы хотя бы раз код из этого варианта выполнился.)
--вопрос
после цикла нужно проверить все ли обязательные варианты были отработаны и если нет — выдать ошибку с переченем всех невыполненных вариантов.

как это реализовать? Решение необходимо типовое, т.к. таких switch много и в разных фунциях и классах.
Re: Вопрос по switch - case
От: HeaveN Россия  
Дата: 12.10.03 06:26
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>как это реализовать? Решение необходимо типовое, т.к. таких switch много и в разных фунциях и классах.


Можно так:

#define C1_FINISHED 0x01
#define C2_FINISHED 0x02
#define C3_FINISHED 0x04
#define C4_FINISHED 0x08
#define C5_FINISHED 0x10
#define C6_FINISHED 0x20
#define C7_FINISHED 0x40
#define C8_FINISHED 0x80

BYTE flags = 0;

while (){
...
switch(a)
{
      case c1:...
      flags |= C1_FINISHED;
      break;
      case c2:...
      flags |= C2_FINISHED;
      break;
      ...
      default:
}

if (flags == 0xFF)
{
     // all variants finished
         ...
}

flags = 0;


Соответственно, если у типа enum больше значений, то можно взять WORD или DWORD.
... << RSDN@Home 1.1 beta 2 >>
Нет такого закона, что человеку летать нельзя...
Re[2]: Вопрос по switch - case
От: WiseAlex Беларусь  
Дата: 12.10.03 16:39
Оценка:
Здравствуйте, HeaveN, Вы писали:

HN>#define C3_FINISHED 0x04

HN>#define C4_FINISHED 0x08
...

HN>[/ccode]


Проблема в том, что индицировать нужно какие именно case не выполнились. Т.е. операции рутинне — нужны красивые 2-3 макроса дли типовой реализации.
Re[3]: Вопрос по switch - case
От: WolfHound  
Дата: 12.10.03 19:08
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>Проблема в том, что индицировать нужно какие именно case не выполнились. Т.е. операции рутинне — нужны красивые 2-3 макроса дли типовой реализации.

Возьми std::set...
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Вопрос по switch - case
От: Кодт Россия  
Дата: 13.10.03 07:51
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>Проблема в том, что индицировать нужно какие именно case не выполнились. Т.е. операции рутинне — нужны красивые 2-3 макроса дли типовой реализации.


Если enum имеет диапазон 0..31, то можно использовать битовые маски; если в пределах, скажем, 256 — массив булей; иначе — std::vector<bool>, std::set<YourEnum>

При общей структуре кода
CLEAR_CASES();

while(...)
{
  ...

  SET_CASE(a);
  switch(a)
  {
  ...
  }
  ...
}

if(CASE_NOT_PASSED(A1)) { ... }
if(CASE_NOT_PASSED(A2)) { ... }


реализации будут такими:

DWORD
// CLEAR_CASES()
DWORD allcases = 0;

// SET_CASE(a)
allcases |= (1<<a);

// CASE_NOT_PASSED(v)

((allcases & (1<<v)) == 0)


vector<bool>; bool[n]
// CLEAR_CASES()
vector<bool> allcases(max_a - min_a);
bool allcases[max_a - min_a] = { false };

// SET_CASE(a)
allcases[a - min_a] = true;

// CASE_NOT_PASSED(v)
!(allcases[v - min_a])


set<YourEnum>
// CLEAR_CASES()
set<int> allcases;

// SET_CASE(a)
allcases.insert(a);

// CASE_NOT_PASSED(v)
(allcases.find(a) == allcases.end())
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.