2017-04-21 11 views
-3

Hier ist die Hauptfunktion, wo 9 weitere Funktionen aufgerufen werden. Ich werde dir eine andere Funktion zeigen, um zu verstehen, was mein Ziel ist.Break while loop

int main() { 
    char B[rows][columns]; 
    char answer; 
    int newgame; 
    printf("Are you ready to play? Answer with y (or Y) for yes or n (or N) for no\n"); 
    scanf("\n%c",&answer); 
    while(answer!='N' && answer!='n'){ 
     fillArray(B); 
     printArray(B); 
     answer='y'; 
     while(answer!='N' && answer!='n'){ 
      vasilhs(B); 
      printArray(B); 
      check_draw(B);//I will place an if statement after the check_draw function 
      check_vertical_win(B); 
      check_horizontal_win(B); 
      check_right_diagonal_win(B); 
      check_left_diagonal_win(B); 
      antipalos_paikths(B); 
      printArray(B); 
      check_draw(B); 
      check_vertical_win(B); 
      check_horizontal_win(B); 
      check_right_diagonal_win(B); 
      check_left_diagonal_win(B); 
     } 
     printf("Do you want to play again?\n"); 
     scanf("\n\n%c",&answer); 
    } 
    }//end of main function 
    //function check_draw 

    void check_draw(char A[rows][columns]){ 
    int i,j; 
    int newgame; 
    //if statement will check in an matrix if the following elements are equal to '-' 
    if(A[0][0]!='-' && A[0][1]!='-' && A[0][2]!='-' && A[0][3]!='-' && A[0][4]!='-' && A[0][5]!='-' && A[0][6]!='-'){ 
     printf("The result is a draw"); 
     newgame=10; 
    } 
} 

Also, wenn if-Anweisung in Funktion check_draw Wahr ist die Variable newgame erhält den Wert 10.

if(newgame==10){ 
    break; 
} 

Warum, wenn ich diese if-Anweisung nach dem check_draw Anruf, es ist nicht das brechen while-Schleife?

+0

Sie können nicht direkt auf lokale Variablen einer Funktion in einem anderen zugreifen! – CinCout

+0

Da 'check_draw' eine _own_ Kopie von' newgame' hat, unterscheidet sie sich von der in main. Du solltest besser 'check_draw' (und die anderen ähnlichen Funktionen) einen Wahr/Falsch (1/0) Wert zurückgeben und' if (checkDraw (B)) brechen; 'in main. – TripeHound

+0

Wo sind 'rows' und' columns' definiert? – Marievi

Antwort

0

Von Ihrer Code-Implementierung:

void check_draw(char A[rows][columns]){ 
    int i, j; 
    int newgame; 
    //if statement will check in an matrix if the following elements are equal to '-' 
    if (A[0][0] != '-' && A[0][1] != '-' && A[0][2] != '-' && A[0][3] != '-' && A[0][4] != '-' && A[0][5] != '-' && A[0][6] != '-'){ 
     printf("The result is a draw"); 
     newgame = 10; 
    } 
} 

int newgame hier lokale Kopie check_draw Funktion.

Wenn eine andere Variable mit demselben Namen als globale Variable existiert, dann sollten Sie int newgame nicht innerhalb der check_draw Funktion deklarieren. Es wird eine lokale Kopie erstellt, mit der gearbeitet werden kann.

Empfehlung:

int newgame;// Write it outside main 
void check_draw(char A[rows][columns]){ 
    int i, j; 
    //if statement will check in an matrix if the following elements are equal to '-' 
    if (A[0][0] != '-' && A[0][1] != '-' && A[0][2] != '-' && A[0][3] != '-' && A[0][4] != '-' && A[0][5] != '-' && A[0][6] != '-'){ 
     printf("The result is a draw"); 
     newgame = 10; 
    } 
} 

Wenn Sie schreiben int newgame; außerhalb Haupt- und nicht innerhalb check_draw Funktion jede lokale Kopie machen dann newgame = 10; Anweisung innerhalb check_draw Funktion den Wert der globalen newgame ändern.

0

Variable newgame definiert wieder in Funktion check_draw, so ist es eine lokale Kopie von check_draw die mainkeinen Zugriff auf haben.

die Annahme, dass Variablen rows und columns korrekt deklariert ist und in einem Teil des Codes initialisiert hier nicht gezeigt, eine Lösung ist newgame ‚s Wert main und die Erklärung in löschen‚zurückzukehren Haupt‘:

int main() { 
    char B[rows][columns]; 
    char answer; 
    int result; 
    printf("Are you ready to play? Answer with y (or Y) for yes or n (or N) for no\n"); 
    scanf("\n%c",&answer); 
    while(answer!='N' && answer!='n'){ 
     fillArray(B); 
     printArray(B); 
     answer='y'; 
     while(answer!='N' && answer!='n'){ 
      result = check_draw(B); 
     } 
     printf("Do you want to play again?\n"); 
     scanf("\n\n%c",&answer); 
    } 
    }//end of main function 
    //function check_draw 

    int check_draw(char A[rows][columns]){ 
    int i,j; 
    int newgame = -1; 
    //if statement will check in an matrix if the following elements are equal to '-' 
    if(A[0][0]!='-' && A[0][1]!='-' && A[0][2]!='-' && A[0][3]!='-' && A[0][4]!='-' && A[0][5]!='-' && A[0][6]!='-'){ 
     printf("The result is a draw"); 
     newgame=10; 
    } 
    return newgame; 
} 

eine andere Lösung wäre main ‚s Variable newgame als Zeiger übergeben und die Erklärung in check_draw löschen:

int main() { 
    char B[rows][columns]; 
    char answer; 
    int newgame; 
    printf("Are you ready to play? Answer with y (or Y) for yes or n (or N) for no\n"); 
    scanf("\n%c",&answer); 
    while(answer!='N' && answer!='n'){ 
     fillArray(B); 
     printArray(B); 
     answer='y'; 
     while(answer!='N' && answer!='n'){ 
      check_draw(B, &newgame); 
     } 
     printf("Do you want to play again?\n"); 
     scanf("\n\n%c",&answer); 
    } 
    }//end of main function 
    //function check_draw 

    void check_draw(char A[rows][columns], int *newgame){ 
    int i,j; 
    //if statement will check in an matrix if the following elements are equal to '-' 
    if(A[0][0]!='-' && A[0][1]!='-' && A[0][2]!='-' && A[0][3]!='-' && A[0][4]!='-' && A[0][5]!='-' && A[0][6]!='-'){ 
     printf("The result is a draw"); 
     *newgame = 10; 
    } 
} 

Bitte lesen Sie auf den Bereich der lokalen Variablen. Schauen Sie auch here.