Как сделать случай! Default в C - PullRequest
4 голосов
/ 20 января 2012

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

Поскольку это для микроконтроллера, работающего на 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;
}

Ответы [ 4 ]

5 голосов
/ 20 января 2012

Я пойду в ад за это ...

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 */
}
5 голосов
/ 20 января 2012
int was_default_picked;

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

default:
    was_default_picked = 1;
}

if (!was_default_picked)
{
    // Your logic goes here
}
3 голосов
/ 20 января 2012

Почему бы вам не использовать массив указателей на функции, проиндексированных буквой вместо 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.");
}
2 голосов
/ 20 января 2012

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

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!");
}
...