2017-06-28 7 views
0

私はCプログラミングコースの紹介をしています。ポインタを理解しようとしています。私はcounterからgameRuntime();までの変数を渡そうとしましたが、whileループの後にはcounterが返されませんでした。だから、私はポインタを使うことにしました。そして今、私は始めたよりも大変です。ポインタを参照するときにセグメンテーションフォルトに入る

コード:

gameRuntime(&counter); 

#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; 
      } 
     } 
    } 
} 

すべてのヘルプははるかに高く評価されるだろう、TIA

+0

'gameRuntime(counter);' gameRuntime(&counter); 'typoとして閉じる投票。 – dasblinkenlight

+2

コンパイラが問題の内容を正確に伝えていない場合は、新しいコンパイラを入手してください。鉱山は、問題を直接指摘するいくつかの警告を吐き出します。 –

+0

そのようなエラーを回避する良い方法は、すべてのコンパイラの警告を有効にし、コードを実行する前に修正することです。 – dasblinkenlight

答えて

2

変更

gameRuntime(counter); 

あなたはcounterの値を渡している、とtあなたが何かのアドレスのようにそれを使用していますか(あなたはポインタを逆参照しました)。ポインターとintはcで互換性があるためコンパイルされますが、それは動作が定義されているわけではありません。ただし、intへのポインタに関する警告を生成する必要があります。また、すべての警告をエラーに変換して、警告が発生した場合のコンパイルを防止することもできます。

非常にまれなケースでは警告を無視することができます。そのため、経験則としてコンパイラは可能な限り警告を出し、可能であれば警告としてエラーを処理させます。

counterのアドレスをメモリに格納しているポインタcounterを渡すと、ポインタを逆参照することでその場所の値に影響を与えることができます。

関連する問題