2017-06-28 4 views
0

Ich nehme ein Intro zu C-Programmierkurs, und ich versuche, Zeiger zu verstehen, und wie genau sie arbeiten. Ich habe versucht, nur die Variable counter bis gameRuntime(); zu übergeben, aber counter wurde nach der While-Schleife nicht zurückgegeben. Also entschied ich mich für einen Zeiger. Und jetzt bin ich in einer größeren Unordnung als ich angefangen habe.In einen segfault beim Referenzieren Zeiger

Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int *gameRuntime(int *counter) 
{ 
    srand(time(NULL)); 
    int random = rand() % 100 + 1; 
    printf("> %d <\n", random); 
     int guess; 
     *counter = 1; 
     int local_counter = (*counter); 
     while ((guess != random) && (local_counter <= 10)) 
     { 
      printf("\n-----------------------\n"); 
      printf("What is your guess?\n-----------------------\n> "); 
      scanf("%d", &guess); 

      if ((guess > 100) || (guess < 1)) 
      { 
       printf("Please choose a number between 1 and 100\n"); 
      } 
      else if (guess < random) 
      { 
       printf("My number is larger than %d!\n", guess); 
        local_counter++; 
       printf("%d guesses left!\n", (11 - local_counter)); 
      } 
      else if (guess > random) 
      { 
       printf("My number is less than %d!\n", guess); 
        local_counter++; 
       printf("%d guesses left!\n", (11 - local_counter)); 
      } 
      else if (guess == random) 
      { 
       printf("You guessed it! My number was %d!\n", random); 
       printf("You found it with just %d guess(es)!\n", local_counter); 
      } 
     } 
     (*counter) = local_counter; 
     return counter; 
} 

int main() 
{ 
    char quit; 
    int counter; 
    int random; 

    printf("Welcome to the Number Guess Game!\n"); 
    printf("I chose a number between 1 and 100 and you have only 10 chances to guess it!\n\n"); 
    printf("Continue? [Y\\N]\n\n> "); 
    scanf("%c", &quit); 
    if ((quit == 'n') || (quit == 'N')) 
    { 
     printf("Exiting...."); 
      return 0; 
    } 
    else 
    { 
     printf("\n=*=+=*=+=*=+=*==*=+=*=+=*=+=*==*=+=*=+=*=+=*==*=+=*=+=+*\n"); 
     printf(" ~  ~  ~  Ready?  ~  ~  ~ \n"); 
     printf("=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*=+=*\n"); 
     printf("\n"); 
     printf("\n-----------------------"); 
     printf("\nOk, I've made up my mind!\n"); 
     printf("-----------------------\n"); 
    } 

    gameRuntime(counter); 
    printf("\n---%d---\n", counter); 

    char continueGame; 
    while ((continueGame != 'N') || (continueGame != 'n')) 
    { 
     printf("\n---%d---\n", counter); 
     if (counter >= 10) 
     { 
      printf("SORRY! You could not find my number with 10 guesses!\n"); 
      printf("My number was %d\n", random); 
      printf("Maybe next time!\n"); 
      printf("\nTry again? [Y\\N]\n"); 
      scanf(" %c", &continueGame); 

      if ((continueGame == 'Y') || (continueGame == 'y')) 
      { 
       gameRuntime(counter); 
      } 
      else 
      { 
       printf("Thanks for playing! See you later!"); 
        return 0; 
      } 
     } 
     else 
     { 
      printf("Play again? [Y\\N]\n> "); 
      scanf(" %c", &continueGame); 

      if ((continueGame == 'Y') || (continueGame == 'y')) 
      { 
       gameRuntime(counter); 
      } 
      else 
      { 
       printf("\nThanks for playing! See you later!"); 
        return 0; 
      } 
     } 
    } 
} 

Jede Hilfe wäre sehr willkommen, TIA

+0

'gameRuntime (Zähler);' -> 'gameRuntime (& counter);' Voting zu schließen, wie ein Tippfehler. – dasblinkenlight

+2

Wenn Ihr Compiler Ihnen nicht genau gesagt hat, was das Problem ist, holen Sie sich einen neuen Compiler! Mine spuckt mehrere Warnungen aus, die direkt auf das Problem hinweisen. –

+0

Eine gute Möglichkeit, Fehler wie diese zu vermeiden, besteht darin, alle Compiler-Warnungen zu aktivieren und sie zu beheben, bevor Sie Ihren Code ausführen. – dasblinkenlight

Antwort

2

ändern

gameRuntime(counter); 

zu

gameRuntime(&counter); 

Sie den Wert von counter vorbei, und t Wenn du es benutzt hast, als ob es die Adresse von etwas wäre (du dereferenziert den Zeiger). Es kompiliert, weil Zeiger und int s in c austauschbar sind, aber das bedeutet nicht, dass das Verhalten definiert ist. Es sollte jedoch eine Warnung über den Zeiger auf int Konvertierung generiert werden. Sie können auch alle Warnungen in Fehler umwandeln, um die Kompilierung im Falle einer Warnung zu verhindern.

Warnungen können in sehr seltenen Fällen ignoriert werden. Als Faustregel muss der Compiler vor allem gewarnt werden und wenn möglich Warnungen als Fehler behandeln.

Durch Anwenden der vorgeschlagenen Korrektur übergeben Sie die Adresse counter, die ein Zeiger ist, der den Speicherort counter im Speicher hält, so dass Sie dann den Wert an dieser Stelle durch Dereferenzieren des Zeigers beeinflussen können.