2017-01-23 7 views
0

これは私の最初のstackoverflowポストです。CS50描画関数はゼロのみを描画します

私はedxでCS50コースをやっていますが、現在私は問題3に固執しています。私は15のゲームを実装しています。 init()関数はボードを初期化し、draw関数はそれを描画する必要がありますが、問題があります。

draw関数は、init()関数から値を取得しません。私はそれを試してみました、init()関数では値は正しいですが、描画関数ではすべて0です。

問題が何ですか?

/** 
* Initializes the game's board with tiles numbered 1 through d*d - 1 
* (i.e., fills 2D array with values but does not actually print them). 
*/ 
void init(void) 
{ 
    //initializing the board 
    int board[d][d]; 
    int x = (d*d) -1; 
    //this loop goes trough each row 
    for(int i = 0; i < d; i++){ 
     //this goes trough each column 
     for(int j = 0; j < d ; j++){ 
      //this condition handles the case of swapping the 2 and 1 when the grid is even 
      if((d % 2) == 0 && (x == 2)){ 
       //assigning the number 1 
       board[i][j] = x-1; 

       //going to the next column 
       j++; 

       //assigning the number 2 
       board[i][j] = x; 

       //setting the x = 0 so the loop can end 
       x=0; 
      } 
      //this happens if the above conditions are not met 
      else { 
       //assigning the value to the grid 
       board[i][j]= x; 

       //decrementing the value 
       x--; 
      } 
      //ending the loop 
      if(x == 0){ 
       break; 
      } 
     } 
     //ending the loop after the last tile is initialized 
     if(x == 0){ 
      break; 
     } 
    } 
} 
/** 
* Prints the board in its current state. 
*/ 
void draw(void) 
{ 
    for(int i = 0; i < d; i++){ 
     for(int j = 0; j < d; j++){ 
      if(board[i][j] != 0){ 
       printf("%2i", board[i][j]); 
      } else { 
       printf("_"); 
      } 
     } 

    printf("\n");  

    } 
+2

'void init(void) { //ボードの初期化 int board [d] [d];'この 'board'はローカルです。 – BLUEPIXY

+0

これが解決しました。ありがとうございました:D –

答えて

1

board[][]はローカル変数であるため、init()環境内でのみ動作します。

私もCS50xコースを受講していますが、彼らが扱っているfifteen.cファイルは実際にすでに2734:int board[DIM_MAX][DIM_MAX];で宣言されているboard[][]変数を持っています。これはすでにグローバルです。

別のボードを作成する必要はありませんので、お手元のボードを使用してください。

+0

ええ、私はそれに気づいた、ありがとう:D –

1

これはあなたを助けるかもしれない:あなたのinit関数で何をすべきかhttps://www.tutorialspoint.com/cprogramming/c_scope_rules.htm

基本的にすべてが(変数名&値)は、この関数やブロック内でのみ有効です。あなたがそうのような主要機能の上にそれをdeclairingによってint board[d][d];グローバル変数を作ることができるのいずれかこの問題を解決するには

(非常に落胆!):

int board[d][d]; 

int main(int argc, char** argv){ ... } 

ORあなたはあなたの関数への参照としてvaribale board[d][d]を与えることができますdraw これは動作しますが、変数全体がコピーされるため非効率です。

void draw(int board[][]){...} 

か、mallocは男のmalloc関数を参照してくださいCコマンドを使用して、ヒープ上board[d][d]のためのメモリを割り当てることができます。それであなたのコードはこのようになります。

void *ptr = malloc(sizeof(board)); //you need to error check this. See man malloc 

これを行う場合は、関数内のデータにポインタを渡すだけで済みます。これは、データがヒープメモリ上にとどまるため、より効率的です。

+0

Araysは関数に渡されるとポインタに崩壊するため、渡されたときにボードはコピーされません。多次元配列を渡すことには注意が必要です。http://stackoverflow.com/questions/2828648/how-to-pass-a-multidimensional-array-to-a-function-in-c-and-c –

+0

ことを知っている。ありがとう! しかし、彼の場合にも?関数スタックが終了するとすぐに、関数スタック上で行うことのすべてが失われたと思ったので、Cはデータをとにかくコピーする必要があります。 –

関連する問題