2012-01-20 2 views
4

В программе микроконтроллера у меня есть несколько инструкций, которые я хотел бы выполнить для каждого случая в коммутаторе, кроме значения по умолчанию. Однако я не хочу писать вызов функции или использовать макрос для каждого случая.Как сделать случай по умолчанию в C

Поскольку это для микроконтроллера, работающего на частоте 3-7 МГц, важны скорость и кодовое пространство. Например:

switch(letter) 
{ 
case a: 
    ShowApple(); 
    printf("You entered an english letter."); 
    break; 
case b: 
    ShowBananna(); 
    printf("You entered an english letter."); 
    break; 
... 
case z: 
    ShowZebra(); 
    printf("You entered an english letter."); 
    break; 
default: 
    printf("You did not enter an english letter. Silly human!"); 
    break; 
} 
+0

@Wooble: Как насчет всех функций «ShowApple», «ShowBananna»? Не могу провалиться. –

+0

Если это не было для микроконтроллера ... :) –

+0

да, @BillyIneal это означалось как заполнитель для большего количества кода. Как и печать. – Jeremy

ответ

5
int was_default_picked; 

was_default_picked = 0; 
switch (letter) 
{ 
// ... 

default: 
    was_default_picked = 1; 
} 

if (!was_default_picked) 
{ 
    // Your logic goes here 
} 
+1

+1 - но - yuck. Я думаю, я бы предпочел увидеть «goto» –

+0

Я, это была моя первая догадка. Я надеялся, что есть более «элегантный» способ. – Jeremy

+2

Если честно, я не думаю, что это решение неэлегантно. В зависимости от количества случаев, это может быть предпочтительным только потому, что не существует повторного кода - если вы добавляете новый случай, вы не можете забыть обновить логику по умолчанию. –

2

Если это действительно последнее утверждение в каждом конкретном случае, вы можете просто выполнить его после использования, если заявление:

int wasEnglish = 1; 
switch(letter) 
{ 
case a: 
    ShowApple(); 
    break; 
case b: 
    ShowBananna(); 
    break; 
... 
case z: 
    ShowZebra(); 
    break; 
default: 
    wasEnglish = 0; 
    break; 
} 

if (wasEnglish) 
{ 
    printf("You entered an english letter."); 
} 
else 
{ 
    printf("You did not enter an english letter. Silly human!"); 
} 
5

я собираюсь идти в ад для этого ...

switch (foo) { 
default: 
    /* code for default case */ 
    break; 
    if (0) { case 'a': 
     /* ... */ 
    } if (0) { case 'b': 
     /* ... */ 
    } if (0) { case 'c': 
     /* ... */ 
    } 
    /* common code for non-default cases */ 
} 
+0

Я хотел написать lol, но мне нужно было написать 16 символов – Jeremy

+2

Ha! Мне это нравится. –

+0

Мой внутренний программник-программист только что получил мигрень ... – bta

3

Почему бы вам не использовать массив указателей функций, индексированных буквой вместо switch? Это будет как больше пространства, так и скорости. И, ИМО, более читабельна.

static void (*fn_table['z' - 'a' + 1])(void) = { 
    &ShowApple, 
    &ShowBananna, 

    ..., 

    &ShowZebra, 
}; 

if (letter < 'a' || 'z' < letter) 
{ 
    printf("You did not enter an english letter. Silly human!"); 
} 
else 
{ 
    (*fn_table[letter - 'a'])(); 
    printf("You entered an english letter."); 
} 
+0

Это очень интересный способ сделать это. Хотя я считаю, что сложность метода слишком усложняет решение. Также это работает, только если вы знаете что в случаях, когда я делаю это в порядке, в моей «реальной» программе это не так. – Jeremy

+0

Вам также нужно «a» to «z» быть последовательными значениями в вашем наборе символов. Это верно для ASCII, но не для всех наборов символов (EBCDIC приходит на ум). – ouah

+2

Поддержка кодировок символов, отличных от ASCII, на самом деле представляет собой пустую трату времени и силы мозга. Это 2012 год не в 1980 году. У нас есть межсетевые экраны и компьютеры, которые говорят вместе. EBCDIC не является жизнеспособным, кроме изолированных в древнем дерьме который не может быть заменен, и с дезинфицирующими слоями, отделяющими его и взаимодействующим с реальным миром ... :-) –

Смежные вопросы