2016-04-27 6 views
2

私はIARコンパイラでCでコーディングし、二つのループしながら、持っていながらにおけるオペレータ:最初はしばらくの上にスキップしますA「 - 」ループ機能が

i= 5; 
do { 
    Task_sleep(1000); 
}while(i-- && !Ready); 

if (!Ready) 
    { 
     dprint("No ready response!"); 
     return false; 
    } 

そして

i= 5; 
do { 

    Task_sleep(1000); 
    i--; 
}while(i > 0 && !Ready); 

if (!Ready) 
     { 
      dprint("No ready response!"); 
      return false; 
     } 

ループと2番目の正常に動作します。 「Ready」ブールは別のスレッドに設定されています。最初のループはfalseを返し、2番目のループは成功するため、Readyはtrueに設定されません。

私は、コンパイラが私の処理方法を知らないと思っています。間違って設定しています。何か他に起こっていることはありますか?私のセットアップでは、デバッグでコードを実行することはできません。機能へ

編集を追加しました:揮発性として

if(!Ready) 
{ 
dprint("No Ready responce!"); 
return false; 
} 

テスト済みレディ、--i代わりのi--、および準備取り除きます。すべて失敗しました。テスト:

まだIARコンパイラがi-を正しく読み込まず、while関数から-operationを削除する必要があります。皆さんに何か他のものがあれば教えてください。私はこの問題を解決するのに自信を持っています。

+1

最初のものでは、 'i - 'と何も比較していないので、 'while(i--> 0 &&!Ready)'ではないでしょうか? – gmiley

+1

@gmileyえ?暗示されていないのですか? –

+3

@gmiley:いいえ。 'while'に関しては、' i'は 'true'(' i!= 0')または 'false'(' i = 0')のいずれかに評価されます。 – usr2564301

答えて

1

プレデクリメント演算子とポストデクリメントを混同しています。 2つの演算子は異なります。 i----iはともにiとなります。しかし、その価値は異なっています。事後減分演算子のi--の値は、の古いの値がiです。プリデクリメント演算子の--iの値は、の新しいの値がiです。

+0

私はOPが "whileループをスキップする"とは何を意味するのか分かりませんが、iが5で始まると、使用されたポスト/プリデクリメント演算子に関係なくループが発生します。もちろんループも 'Ready'に依存しています... – yano

+0

" Ready "は〜3秒後にtrueに設定されます。最初のループでは、1秒待ってから続行するように見えます。 2番目のループでは、3秒間待ってから動きます。 "Ready"は最初の関数でfalseに設定され、後でスレッドで失敗する。 –

0

volatileキーワードを使用して、最初のバージョンの変数iを修飾することができます。私は先週同様の問題に会った。

1

あなたの最初のコード:

do { 
    Task_sleep(1000); 
}while(i-- && !Ready); 

がこれに相当します

int condition; 
TOP: 
Task_sleep(1000); 
condition = (i != 0 && !Ready); 
i = i - 1; 
if (condition) 
    goto TOP 

あなたの第二のコード:

int condition; 
TOP: 
Task_sleep(1000); 
i = i - 1; 
condition = (i > 0 && !Ready); 
if (condition) goto TOP; 

do { 

    Task_sleep(1000); 
    i--; 
}while(i > 0 && !Ready); 

がこれに相当します

ループが異なります。 iは、条件が評価される時刻とは異なる時刻にデクリメントされ、条件内のiの比較が異なります。