2013-11-26 86 views
0

我有一個for循環,用於查找最危險的特定船隻的最近直升機。C爲什麼這個循環在條件滿足時不能執行?

我遇到的問題是我需要從我的搜索忽略救生艇(這些都有這是一個單一字符的結構的L類型),並只專注於直升機,由H這是一個單個字符代表一個結構。

我的問題是,當我有這樣的循環:

closest_index = 0; 

for (j = 0; j < asset_size; j++) { 
     printf("type : %c \n", (assets + j)->type); 
     if ((assets + j)->type == 'H') { 
      if (((assets + j) ->distance_from_mayday) < ((assets + closest_index) ->distance_from_mayday)) { 
       closest_index = j; 
       printf("closest_index heli = %d \n", closest_index); 

      } 
     } 
    } 

它肯定會被調用,我加了一行:

printf("type : %c \n", (assets + j)->type); 

只是比較之前,它產生這種導致控制檯:

type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : L 
type : H 
type : H 
type : H 
type : H 
type : H 
type : H 

正如你所看到的有H所以我不明白爲什麼這個for循環沒有按照意圖執行,有什麼想法?

+3

有什麼特別的原因,你在使用'(資產+ J) - > field',而不是'資產[J] .field'? –

+2

「不執行」不是一個恰當的描述。日誌輸出顯示它*正在執行,但你沒有得到你想要的最終結果。 – Potatoswatter

+1

所以你已經確定'(assets + j) - > field'有時候通過循環有值'H',但是除了最終要做的內部'printf'。如果問題是你沒有看到那個輸出(我猜這就是它的原因,因爲你只是說「for循環沒有執行」,事實並非如此),那麼我會檢查該條件。 – lurker

回答

1

你的代碼首先假設陣列中的第一個索引,在這種情況下是救生艇,是最接近事件的直升機。

也許嘗試這樣的事:

closest_index = 0; 
closest_distance = INT_MAX; 

for (j = 0; j < asset_size; j++) { 
     printf("type : %c \n", assets[j]->type); 
     if (assets[j]->type == 'H') { 
      if (assets[j]->distance_from_mayday < closest_distance) { 
       closest_index = j; 
       closest_distance = assets[j]->distance_from_mayday; 
       printf("closest_index heli = %d \n", closest_index); 
      } 
     } 
    } 

如果您的列表將始終與helis末排序(和你將永遠有至少一個直升機),那麼你可以通過改變你的初始條件確定到:

closest_index = asset_size -1; 
+0

這個工作,使用var來存儲當前最接近的值,這讓我明白了爲什麼我會出錯,乾杯牛!回答,接受! –

+1

僅供參考,添加termporary vars找到問題是調試101。 –

3

我想,列表中的第一個元素的類型是'L',並且低於或等於任何'H'值。您的closest_index標記不會因此移動。

這將是更好地爲記錄的距離本身或者使用一個不可能的起始值(-1?)closest_index

編輯:

建議代碼:

struct asset *result = NULL; 

for (j = 0; j < asset_size; j++) { 
    if (assets[j].type != 'H') 
     continue; 
    if (!result || assets[j].distance < result->distance) 
     result = &assets[j]; 
} 
+0

設置'closest_index = -1'會導致第一次迭代時發生緩衝區溢出,除非它是特殊的。 – Potatoswatter

+0

我有相同的代碼,但比較'L'的值,它工作正常,closest_index以相同的方式實現,並正確運行。它必須從0開始,所以如果第一個元素是最接近的,那麼nearest_index不會改變,並且我正在評估的資產由J控制,它確實增加了,所以我不認爲它的問題:/只是FYI元素7最低的距離。 –

+0

@Patatoswatter當然,你必須檢查這個(這就是爲什麼我會記錄距離並比較這個) – ensc

1

問題不是for;這是if:你們的直升機都比第一艘救生艇更近。下面是解決這個問題的一種方法:

closest_index = -1; 

for (j = 0; j < asset_size; j++) { 
    printf("type : %c\n", (assets + j)->type); 
    if ((assets + j)->type == 'H') { 
    if ((closest_index < 0) || 
     (assets + j)->distance_from_mayday < 
      (assets + closest_index)->distance_from_mayday) { 
     closest_index = j; 
     printf("closest_index heli = %d\n", closest_index); 
    } 
    } 
} 

作爲獎勵,如果沒有直升機的循環將與closest_index == -1退出。

如果你關心最接近的資產,但不索引,可以簡化環路以及:

Asset *closest_asset = NULL; 

for (j = 0; j < asset_size; j++) { 
    Asset *this_asset = assets + j; 
    printf("type : %c\n", this_asset->type); 
    if (this_asset->type == 'H' && 
     (closest_asset == NULL || 
     this_asset->distance_from_mayday < closest_asset->distance_from_mayday) { 
    closest_asset = this_asset; 
    printf("closest_index heli = %d\n", j); 
    } 
} 
相關問題