2010-12-02 5 views
0

Je suis en train d'écrire un simple exécutant de la machine d'Etat en C. J'ai ce code:Pourquoi ne pas incrémenter 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; 
} 

Je ne comprends pas pourquoi, si z ne doit être remis à zéro lorsque la ligne actuelle je lis de la lignes est égal à ".", Ce qui se produit toutes les trois occurrences dans mon scénario de test, z reste égal à 0, même lorsque x est incrémenté avec succès toutes les trois lignes.

je besoin d'une sortie comme ceci:

1 0 \ n 1 1 \ n 1 2 \ n 2 0 \ n 2 1 \ n 2 2 \ n 3 0 \ n 3 1, etc .. .

Au lieu de cela je reçois:

1 0 \ n 1 0 \ n 1 0 \ n 2 0 \ n 2 0 \ n 2 0 \ n 3 0 \ n 3 0, etc. ..

Qu'est-ce que je dois changer? C'est peut-être une question stupide, mais je ne comprends vraiment pas ce qui ne va pas ici.

Nous vous remercions de votre aide.

Répondre

9

z est toujours d'être mis à zéro. L'instruction if ne fonctionne pas en fonction de la ligne, elle passe au point-virgule suivant.

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

est le même que:

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

z = 0; 

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

Puisque vous avez deux déclarations (x++; z = 0;), vous devez mettre des accolades autour d'eux pour préciser la condition:

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

accolades d'utilisation, évite toute confusion :)

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 Il est intéressant de noter que lorsqu'ils ne sont pas en utilisant des accolades, seule la première instruction est exécutée sous condition, à savoirjusqu'au point-virgule, pas le saut de ligne. – Skilldrick

+0

ou, dans ce cas, vous pouvez mettre un ',' au lieu de ';';); – ruslik

+0

Merci, donc c'était juste parce que je n'ai pas utilisé d'accolades. Ma faute. –

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

est le même que:

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

Vous voulez probablement

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

Votre problème est dans cette ligne:

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

Sans bretelles, si seulement comprendra la déclaration x++ et votre compilateur interprétera votre code tel que:

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

Alors que z = 0 est exécuté à chaque fois. Pour résoudre ce problème, utilisez des accolades (pour 2 ou plusieurs déclarations dans un bloc if)

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

Salut, tout le monde. Erreur de débutant. –

Questions connexes