2011-10-16 13 views
5

私はforのループで2つの変数を使う必要があるコードを書いています。以下のコードは問題ありませんか?Cの 'for'ループの2つの変数

それは私に予想される結果を与えます。

for (loop_1 = offset,loop_2 = (offset + 2); loop_1 >= (offset - 190),loop_2 <= (190 + offset + 2); loop_1--,loop_2++) 
{ 
    if ( (*(uint8_t*)(in_payload + loop_1) == get_a1_byte(bitslip)) && 
     ((*(uint8_t*)(in_payload + loop_2) == get_a2_byte(bitslip))) 
     ) 
    { 
      a1_count++; 
    } 
} 

は、しかし、私は言うコンパイラの警告を取得しています:

FILE.C:499:73:警告は:コンマ式の左側のオペランドは効果がありません

何これは意味ですか?

+5

のようになりますと仮定していませんでしたそれはやっている:-)私はいつもCプログラマーに賞賛してきた。 –

+2

@DarinDimitrovもし私がC#で書き換えることができますが、それは同じです:-) – xanatos

+0

@ xanatos、オハイオ州、私は心からあなたがこのようなことをC#で書かないことを願っています。私はポインタを意味する? BCLには、これを達成するための何かが組み込まれています(このコードが何を達成しようとしていても)。 –

答えて

24

問題は、試験条件である:

loop_1 >= (offset - 190),loop_2 <= (190 + offset + 2) 

これは、両方の部分をチェックしません。 (まあ、それはありませんが、2番目の部分の結果だけが使用されます。)

(loop_1 >= (offset - 190)) && (loop_2 <= (190 + offset + 2)) 

変更、それをあなたは両方の条件がチェックされるようにする場合。

16

マットが正しいですが、あなたはおそらくにあなたのコードを簡素化を検討する必要があります。(あなたは明らかにあまりにも蚊帳の外in_payload + offsetの計算を巻き上げることができますが、オプティマイザはほぼ確実にあなたのためにそれを行うだろう

for (i = 0; i <= 190; i++) 
{ 
    uint8_t *pl1 = (uint8_t *)(in_payload + offset - i); 
    uint8_t *pl2 = (uint8_t *)(in_payload + offset + i + 2); 

    if (*pl1 == get_a1_byte(bitslip) && *pl2 == get_a2_byte(bitslip)) 
    { 
     a1_count++; 
    } 
} 

)。

1

意味的な問題については、カフェの答えを参照してください。最初に入力を開始する前にあなたの考えをまっすぐにしてみてください。

誤解の1つは、C、初期化と割り当ての2つの異なる概念を混在させていることです。明らかにあなたのコードでは、カンマ付きのものが完全に動作する初期化の行を考えています。したがって、次回同様の問題が発生した場合は、ローカル変数を使用してください。これらはC99の有効な構成要素であり、何とか使用するのに良いことです。

あなたは私たちに、変数の種類を与えるがすごい、私はこのコードを凝視しないとにかかわらず、私は私がやっと何を理解することができますしてみてくださいいかに難しいのですsize_tあなたfor文が

for (size_t loop_1 = offset, loop_2 = (offset + 2); 
    loop_1 >= (offset - 190) && loop_2 <= (190 + offset + 2); 
    loop_1--, loop_2++) 
関連する問題