2016-11-27 41 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應該如何區別?