2016-11-21 70 views
-4
for (int i = 0; i < 6; i++) { 
    led_r1 = ~led_r1; 
    led_r2 = ~led_r2; 
    led_l1 = 0; 
    led_l2 = 0; 
    DelayMs(60); 
    if (check == 1) { 
     check = 0; 
     right_check = 0; 
     left_check = 0; 
     goto new_pattern; 
    } 
    if (off == 2) { 
     off = 1; 
     right_check = 0; 
     left_check = 0; 
     goto reset; 
    } 
} 

這是我的代碼來閃爍兩個LED在我的項目... 它工作正常,但我的程序是正確的......? 這種使用goto語句的方式是正確的..? 它會崩潰程序enter code here上午..? enter code herec語言中斷循環

是他們的任何其他方式終止程序並跳轉到程序的其他部分

+0

您是否知道C處已經有一個'破'命令?你爲什麼不使用它? –

+1

Goto聲明被認爲是有害的。這是在1968年的突發新聞。 – Lundin

+0

在我的程序中看到如果(關== 2)如果它發生我必須另一個位置..?我怎樣才能做到沒有goto語句..我是新來的c語言。請給我建議解決方案 – steve

回答

0

這是相當困難根據您所提供的代碼來回答你的問題,因爲你沒有給會怎麼樣任何解釋在new_pattern:reset:標籤上,或者您如何期望變量的值在沒有可能導致此情況發生的指令的循環內發生變化。

但是,正如Lundin在評論中指出的那樣,您應該嘗試avoid the use of goto statements whenever possible。它們往往會導致代碼不可讀,不可維護。

相反,您應該嘗試遵循structured programming的原則。特別是,你應該考慮使用函數來更合理地組織你的代碼。 (選擇適當的描述函數的名稱也將讓你的代碼更容易理解。)

你的代碼的結構重新工作可能是這個樣子:

#define NO_CHANGE  0 
#define UPDATE_PATTERN 1 
#define RESET_LEDS  2 

int main() { 
    /* ... */ 
    switch(flash_leds()) { 
     case UPDATE_PATTERN: 
      new_pattern(); 
      break; 
     case RESET_LEDS: 
      reset(); 
      break; 
     default: 
      /* Done flashing; no action required */ 
    } 
    /* ... */ 
} 

int flash_leds() { 
    for (int i = 0; i < 6; i++) { 
     /* ... */ 
     if (check == 1) return UPDATE_PATTERN; 
     if (off == 2) return RESET_LEDS; 
    } 
    return NO_CHANGE; 
} 

void new_pattern() { 
    /* update the pattern displayed by the LEDs */ 
} 

void reset() { 
    /* reset the LEDs */ 
}