#c #c #switch-statement
#c #c #switch-statement
Вопрос:
Как обрабатывать, когда когда-нибудь выходит новый релиз SW, и он добавляет еще один индекс к switch case
. Индекс представляет параметр в этом случае. Например,
Rel1: i = 1-5, 7 (исключая 6)
Rel2: i = 1-7
for (int i = 1; i<=7;i )
{
switch (i)
{
case 1: /*process data*/ break;
case 2: /*process data*/ break;
case 3: /*process data*/ break;
case 4: /*process data*/ break;
case 5: /*process data*/ break;
// case 6: // REL 2
case 7: /*process data*/ break;
default: break;
}
}
Могу ли я на самом деле проверить, добавив if
оператор между этими случаями? Есть идея получше?
Комментарии:
1. Вы хотите указать своему приложению во время выполнения, какой выпуск обрабатывать, или во время компиляции?
2. Почему вы не ставите
if (Rel2) {...}
сразу послеcase 6:
?3. Кто-нибудь, пересмотрите мой вопрос и описание, я действительно признателен за это. Это идеально!
Ответ №1:
#define
какой это релиз, а затем использовать #ifdef
.
switch (i)
{
case 1: /*process data*/ break;
case 2: /*process data*/ break;
case 3: /*process data*/ break;
case 4: /*process data*/ break;
case 5: /*process data*/ break;
#ifdef REL_2
case 6: /*process data*/ break; // <-- executed only for REL_2
#endif
case 7: /*process data*/ break;
default: break;
}
Комментарии:
1. Да, именно поэтому я спрашиваю в основном потоке, могу ли я на самом деле поместить if else между cases. Спасибо. Спасибо всем за ответы. Некоторые из ваших идей находятся на высоком уровне, из-за чего я не смог получить полную картину. Я извинился за это.
Ответ №2:
В производственном коде, если у меня получается неожиданный результат, подобный этому, я часто пытаюсь зафиксировать и зарегистрировать его. Выдача исключения может быть допустимой в зависимости от того, как оно обрабатывается. Для проверки на будущее обычно полезно разрабатывать подобные вещи, чтобы изящно обрабатывать новые значения.
Комментарии:
1. На данный момент это не очень хороший дизайн. Этот инструмент обрабатывает и анализирует автономные данные, это зависит от других конфигураций, поэтому он непредсказуем. с этими новыми параметрами сложно справиться. Я думал, что на данный момент есть способ обойти. Спасибо за ваши комментарии.
Ответ №3:
Вместо использования цикла ‘for’ используйте цикл ‘while’ с функцией генератора номеров выпуска.
Псевдокод:
typedef enum {rel1, rel2} rel_t;
// Where 'ReleaseSequence' is a generator functor. Class that takes rel_t
// in constructor and creates an appropriate functor that returns the
// required sequence of numbers for a particular release
ReleaseSequence seq(rel1);
while (i = seq()) {
switch (i) {
case 1:...
case 2:...
case 3:...
case 4:...
case 5:...
case 6:...
case 7:...
default:
break;
}
}
Комментарии:
1. Я вижу ваши потенциальные идеи здесь, основная последовательность составляет около 100 , если rel1 добавляет только один индекс, я должен получить другой набор последовательностей для rel1, например 1-7 или 100-101. Возможно, я не совсем понимаю ваши идеи. Я думал, что могу сделать, как if (REL1), добавить еще один индекс. Или установите флаг. Спасибо, что уделили мне время.
Ответ №4:
Мне кажется очень странным видеть switch
вложенный в цикл…
Похоже, что вы выполняете канал. Тогда почему бы вам просто не определить is как один.
Например, неплохо бы использовать простой массив указателей на функции. Вы можете определить один такой канал для каждого выпуска и предоставить функции «noop» для игнорирования параметров.
Ответ №5:
Если вы хотите перехватить неожиданные значения, не следует ли вам поставить эту проверку в default
части?
...
default:
assert(false); // We should never get here!