-1

AVR ATmega32-A マイクロコントローラーのコードを書いています。以下に示すように、スイッチケースを使用しています。

  unsigned char Command;
  unsigned int  Param;

  void runCom(void){

    switch(Command){

        case(NO_COM):
            Command = 0;
            break;

        case(INF):
            printf("\r\n\r\n");
            printf("university\r\n");
            printf("sweden\r\n");
            printf("Ver. 1.0A\r\n");

            Command = 0;
            break;

        case (DB):                        
            Command = 0;
            break;


        case(CLEARM):
            Command = 0;
            break;

        default:
            Command = 0;
            break;   
    }
}

上記のコードは機能していますが、以下に示すように、そのスイッチにもう 1 つのケースを追加したいと考えています。

 unsigned char Command, Command1;
 unsigned int  Param;
 void runCom(void){

    switch(Command){

        case(NO_COM):
            Command = 0;
            break;

        case(INF):
            printf("\r\n\r\n");
            printf("university\r\n");
            printf("sweden\r\n");
            printf("Ver. 1.0A\r\n");

            Command = 0;
            break;

        case (DB):                        
            Command = 0;
            break;



         case(ADC):
             printf("ADC Value",ReadAd()); 

             printf("Enter Amplification stage");

                       switch(Command1){

                              case(stage1):
                                    PORTC=0x00;
                                    DDRC=0xC0; 
                                    printf("ADC Value",ReadAd());
                                    Command1 = 0;  
                                    break;

                                    case(stage2):
                                    PORTC=0x00;
                                    DDRC=0x03; 
                                    printf("ADC Value",ReadAd());
                                    Command1 = 0;  
                                    break;
                                   }    
            Command = 0;
            break; 

        case(MEM):
            Command = 0;
            break;

        case(CLEARM):
            Command = 0;
            break;

        default:
            Command = 0;
            break;   
    }
}

次のようなエラーが発生しています

   undefind symbol 'ADC'
   undefind symbol 'stage1'
   undefind symbol 'stage2'

それから私はこのように宣言しました

unsigned char Command, ADC, Command1, stage1, stage2;
  unsigned int  Param;

今、私は次のようなエラーが発生しています

constant integral expression required at line case(ADC)
constant integral expression required at line case(stage1)
constant integral expression required at line case(stage2)

このエラーを克服する方法を教えてください。私はWGP、WGF、INFをどこにも宣言していませんが、「WGF、WGP、INFの未定義のシンボルを取得していません。なぜこのエラーがADCでのみ発生するのですか。以前に使用したのと同じスイッチケースルールを適用しました。提案をいただければ幸いです。 .

前もって感謝します。

4

2 に答える 2

3

a の値は、定数またはリテラルcaseである必要があります。

たとえば、検索すると、 'd リテラルWGPである可能性が最も高いことがわかります。#defineあなたの新しい価値観についても同じことをしてください。

于 2012-09-28T08:19:39.670 に答える
1

switch ステートメントのケースで使用する値は、コンパイル時の定数でなければなりません。つまり、コンパイル時にコンパイラに認識される固定値が必要です。

これを行うには、主に 4 つの方法があります。

  1. 定数リテラル (数値) を使用できます。
   case 42:

名前のない値 (「マジック ナンバー」) を使用することはお勧めできません。これは、コードがまったく文書化されておらず、コードが脆弱になるためです (5 つの異なる場所で値を 43 に変更する必要があり、そのうちの 1 つを忘れた場合はどうなるでしょうか)。 ?)

  1. プリプロセッサ定数を使用できます。
   #define COMMAND_CODE 42
   ...

   case COMMAND_CODE:

コマンド コードの値を 43 に変更する必要がある場合は、#define を変更するだけで済みます (ヘッダー ファイルで 1 回だけ実行する必要があります)。

  1. 列挙型を使用できます。
   typedef enum { COMMAND_ON=42, COMMAND_OFF=2, COMMAND RESET=77 } command_codes:
   ...

   case COMMAND_ON:
  1. C++ では、コンパイラがかなり最新の場合、定数を使用できます。
   const int magic_number = 42;

   case magic_number:

(case ステートメントで示されるスイッチ値は、括弧で囲む必要がないことに注意してください。)

あなたが示したコードから、コマンド、ADCなどを(定数ではなく)変数として定義したようです。この場合、コンパイラは、コードをコンパイルするときに、実行時にこれらの変数が持つ値を知ることができません。この言語では、コンパイラが高速なコードを生成できるように、コンパイル時に大文字と小文字の値を認識しなければならないことが指定されています (一連の if ... else if ... else if ステートメントよりも高速です)。

于 2012-09-28T08:44:39.570 に答える