2010-12-02 7 views
0

私はこのコードを持っているC.でシンプルなステートマシンのexecutorを記述しようとしています:なぜzをインクリメントしないのですか?

while(1) { 
    strcpy(fsm.state[x][z], lines[i]); 
    printf("%i %i\n", x, z); 
    z++; i++; 
    if(strcmp(lines[i], ".") == 0) x++; z = 0; 
    if(strcmp(lines[i], "") == 0) break; 
} 

現在の行は、私はから読んでいたときにZのみリセットする必要がある場合、私は理由を理解していませんlines配列は、xが3行おきに正常にインクリメントされた場合でも、038と等しいです。

は、私はそうのような出力が必要になります。

1 0 \ nは1 1 \ nは1 2 \ nは2 0 \ nは2 1 \ nは2 2 \ nは3 0 \ nは3 1、など。 。

代わりに私が取得:

など

1 0 \ nは1 0 \ nは1 0 \ nは2 0 \ nは2 0 \ nは2 0 \ nは3 0 \ nは3 0、 ..

何を変更する必要がありますか?これは愚かな質問かもしれないが、私は本当にここで何が間違っているのか理解していない。

ご協力いただきありがとうございます。

答えて

9

zは常にゼロに設定されています。 ifステートメントは、行に基づいて動作しません、次のセミコロンに移動します。あなたは二つの文(x++; z = 0;)を持っているので、あなたが条件を指定するためにそれらの周りにブレースを配置する必要があり

if(strcmp(lines[i], ".") == 0){ 
x++; 
} 

z = 0; 

if(strcmp(lines[i], "") == 0){ 
break; 
} 

if(strcmp(lines[i], ".") == 0) x++; z = 0; 
if(strcmp(lines[i], "") == 0) break; 

は同じです

if(strcmp(lines[i], ".") == 0){ 
x++; 
z = 0; 
} 
7

使用ブレース、混乱を避ける:)

while(1) { 
    strcpy(fsm.state[x][z], lines[i]); 
    printf("%i %i\n", x, z); 
    z++; i++; 
    if(strcmp(lines[i], ".") == 0) { 
     x++; 
     z = 0; 
    } 
    if(strcmp(lines[i], "") == 0) { 
     break; 
    } 
} 
+1

+1それはすなわち、中括弧を使用しない場合、最初の文を条件付きで実行されていることは注目に値しますセミコロンまで、改行ではありません。 – Skilldrick

+0

か、この場合、 ';';の代わりに '、';をつけることができます) – ruslik

+0

ありがとう、それは私が中カッコを使用しなかったためです。私の悪い。 –

2
if(strcmp(lines[i], ".") == 0) x++; z = 0; 

と同じです。

あなたはおそらくしたい

if(strcmp(lines[i], ".") == 0) { 
    x++; 
    z = 0; 
} 
1

あなたの問題は、この行である:文x++を含めだけだろうし、あなたのコンパイラは、このようなようなあなたのコードを解釈する場合、中括弧なし

if(strcmp(lines[i], ".") == 0) x++; z = 0; 

if(strcmp(lines[i], ".") == 0) 
    x++; 
z = 0; 

ただし、z = 0は毎回実行されます。それを修正するには、(もしブロックに2つの以上の文のために)中括弧を使用

if(strcmp(lines[i], ".") == 0) { 
    x++; 
    z = 0; 
} 
+0

乾杯、みんな。ルーキーエラー。 –

関連する問題