2016-11-27 52 views
0

我的问题与变量total有关。调试器就像它甚至不在那里一样,或者如果你摆脱了*,它会运行并运行,并提供一个奇怪的数字。该计划的想法是向角色total添加角钱(或10),直到它大于目标10000C变化量正在被越过

我正在用C语言编写IAR Embedded Workbench,并使用MSP430G2553。

#include <msp430g2553.h> 
#include <stdio.h> 
volatile unsigned int i; 
int dime=0; 
int goalz =10000; 
int main(void) 
{ 
     // Stop watchdog timer to prevent time out reset 
     WDTCTL = WDTPW + WDTHOLD; 
     P1DIR |= 0x00; 
     for(;;){ 
     P1OUT =0x01; 
     while(1) 
     { 
      if((BIT4 & P1IN)) 
      { 
      P1OUT |= 0x01; 
      dime++; 
      int *total = 0; 
      *total = &dime; 
      } 
      else 
      { 
      P1OUT |= 0x00; 
      } 
     } 
    } 
} 
+1

请注意,'P1OUT | = 0x00;'是一个无操作。您是否记得'P1OUT&=〜0x01;'重置最低有效位?编译器应该警告类型不匹配的地方'* total = &dime;' - 注意编译器的警告。如果它警告的话,那是因为你的代码错了,它认为它不能在不让你知道你可能犯了错误的情况下编译它。 –

回答

3
int *total = 0; 
*total = &dime; 

错误,因为你想存储的dimetotal指向的位置地址(而不是它的价值),即零=>不是你想要的(有人建议这是一个寄存器的位置,所以即使它没有崩溃,也是无效的。编写INTENA寄存器是而不是好!)。

调试器可能会优化此语句,直接写入零。

不完全确定要达到的目标,但必须声明total作为全局变量并将其添加dime。这里不需要使用指针或变量地址。

+0

在MSP430x2xx上,地址0包含中断使能寄存器。 –

1

可能是因为编译器甚至没有生成代码,所以调试器已经过了一段时间。您正在堆栈中创建变量总数(指针或整数)(即添加项目),您分配一个值,然后您超出范围,因此该变量不再存在。

我认为,你正在努力实现的是:

if (...) { 
    static int total = 0; 
    total = dime 
} 

但是,话又说回来,在总变量是完全无用的,因为它永远是相同的值角钱。 totaldime应该如何区别?