2015-02-08 119 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