2015-02-08 118 views
0

當我執行這個程序,一秒鐘指示燈閃爍,然後2秒,然後循環:使用MPLAB在C語言中聲明全局變量和局部變量有什麼區別?

#include <htc.h> 
#include <pic16f877.h> 

#define _XTAL_FREQ 4e6 

int count; 
int check(int count); 

void main(void){ 
    count = 0; 
    TRISD = 0xBF; 
    count=check(count); 
    count=check(count); 
} 

int check(count){ 
    if(count == 0){ 
     /* blink an led for 1s */ 
     ++count; 
    }else if(count == 1){ 
     /* blink an led for 2s */ 
     ++count; 
    } 
} 

但是,當我執行這個程序,兩件事情發生:

  1. 如果我執行這個程序在我執行完前一個之後,指示燈閃爍1s,然後2s熄滅。

  2. 如果我在任何其他時間執行此程序,一旦它不是在前一個之後,led指示燈熄滅;甚至不眨眼。

    #include <htc.h> 
    #include <pic16f877.h> 
    
    #define _XTAL_FREQ 4e6 
    
    int check(int count); 
    int count = 0; 
    
    void main(void){ 
        TRISD = 0xBF; 
        count=check(count); 
        count=check(count); 
    } 
    
    int check(count){ 
        if(count == 0){ 
         /* blink an led for 1s */ 
         ++count; 
        }else if(count == 1){ 
         /* blink an led for 2s */ 
         ++count; 
        } 
    } 
    

所以我想知道這是什麼行爲與我在當地宣佈我的變量VS全球範圍內的事情。

+0

編譯時啓用警告。在'check()'裏面,變量'count'不是全局變量:它是一個從參數列表中產生的局部變量。 – pmg 2015-02-08 18:17:28

+2

int check(int count);'缺少返回語句'return count;' – francis 2015-02-08 19:46:31

+1

行:'int check(count){'應該是'int check(int count){',並且pmg has注意到,在該參數中傳遞的「count」與程序頂部聲明的全局「count」不同。 (順便說一下,它會降低可讀性,並提供非常有效的混淆因素)建議將函數參數從'count'改爲'c'或'ct'。除了「count」之外的任何東西。 – ryyker 2015-02-08 20:00:20

回答

1

對於所有的實際用途,這兩個程序是完全等效的。您不要在本地聲明變量與全局變量;計數變量在兩個程序中都是全局的。唯一的區別是第一個程序中的count變量被一條指令設置爲零。但它已經爲零,因爲它是全局的,全局變量在加載時被初始化爲零。如果你忽略了第一個程序中的count = 0語句,它們就變得完全相同了。

由於它們是相同的但顯示不同的行爲,問題必須在mplab模擬器中。使用仿真器/ IDE的步驟功能檢查檢查功能中的計數值。

在評論你的問題所有的建議改善代碼,但需要無:

  • 參數沒有一個類型是通過默認的int。所以count參數是一個int;
  • return語句將確保正確的值返回,但在函數的返回值顯然是進行寄存器仍持有數量的增加價值,在英特爾彙編這是AX寄存器:

mov ax, [count] inc ax mov [count], ax