2012-01-20 3 views
4

マイクロコントローラプログラムでは、デフォルト以外のすべてのケースで実行したいいくつかの指示があります。私は、しかし、関数呼び出しを書くか、すべての場合にマクロを使用する必要はありません。Cでのデフォルトのケースの作成方法

これは3-7Mhzで動作するマイクロコントローラのため、速度とコードスペースが重要です。たとえば :

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

はい、@BillyONealは、より多くのコードのプレースホルダとして使用されていました。 printfと同じように。 – 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 - but - yuck。私はむしろ "goto"を見ると思います –

+0

これは私の最初の推測でした。私はもっ​​と「エレガントな」方法があることを望んでいました。 – Jeremy

+2

正直言って、私はこの解決策が美味でないとは思わない。存在するケースの数に応じて、繰り返されるコードがないためにのみ望ましいかもしれません - 新しいケースを追加すると!デフォルトロジックを忘れることはありません。 –

2

それは、それぞれの場合に、本当に最後の文の場合、あなたは、単に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!"); 
} 
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

私は笑を書こうと思ったが、私は16文字を書く必要があった – Jeremy

+2

ハ!私はそれが好きです。 –

+0

私の内部のメンテナンスプログラマーは片頭痛を持っています... – bta

3

の代わりに文字でインデックスされた関数ポインタの配列を使用しないのはなぜですか?それはスペースとスピードの両方を高めます。そして、もっと読みやすいIMO。

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'から 'z'が必要です。これはASCIIでは当てはまりますが、すべてのキャラクタセットでは当てはまりません(EBCDICが心に浮かぶ)。 – ouah

+2

非ASCIIスーパーセット文字エンコーディングをサポートすることは、実際には時間と脳の力を浪費することであり、2012年ではなく1980年です。置き換えることができない、そしてそれを現実の世界から分離し、それを現実の世界とインターフェースすることで、衛生的な層を作ることができます:-) –

関連する問題