2012-09-28 23 views
-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; 
    } 
} 

上述代碼正在工作,但現在我想在該開關中添加一個案例,如下所示。像

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

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; 
    } 
} 

我得到錯誤的話,我已經聲明如下

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上,我已經停用了與以前相同的開關盒規則。 。

在此先感謝。

+0

這是在www.avrfreaks.net上提出的同一問題的交叉帖子。 – johanekdahl

回答

1

在switch語句的情況下使用的值必須是編譯時常量。也就是說,它們在編譯時必須具有編譯器已知的固定值。

有四種主要方法可以做到這一點。

  1. 您可以使用常量字面量(數字)。
case 42: 

注意,使用未命名的值(「幻數」),不推薦使用,因爲它不記錄任何方式的代碼,使代碼脆弱的(如果你需要改變在五個不同的地方值43並忘記一個?)

  1. 您可以使用預處理器常量。
#define COMMAND_CODE 42 
    ... 

    case COMMAND_CODE: 

這是更好,因爲如果你需要在命令碼值changet到43,你只需要改變的#define(應該只出現一次,在頭文件)。

  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: 

(注意的情況下所示的開關值聲明不需要在其周圍有括號)。

從你所顯示的代碼看來,你已經將Command,ADC等等定義爲變量(而不是常量)。在這種情況下,編譯器無法知道這些變量在編譯代碼時在執行時會有什麼值。該語言指定在編譯時必須知道案例值,以便編譯器可以生成快速代碼(比if ... else if else語句的整個系列更快)。

3

值在case需求是常量文字

如果你看看如WGP,你會看到,它最有可能是#define倒是字面值。對你的新值做同樣的操作。