2012-12-30 12 views
15

私はビンゴボードを生成する関数を作成しました。私はビンゴボードを返したいと思います。行列(2D配列)を関数から戻す方法は? (C)

私が期待していなかったように、動作しません。ここ

は関数である。

int** generateBoard() { 
    int board[N][M], i, j , fillNum; 
    Boolean exists = True; 
    // initilize seed 
    srand(time(NULL)); 
    // fill up.. 
    for(i = 0; i < N; ++i) { 
     for(j = 0; j < M; ++j) { 
      exists = True; 
      while(exists) { 
       fillNum = rand()%MAX_RANGE + 1; // limit up to MAX_RANGE 
       if(beenAdded(board, fillNum) == Exist) { 
        continue; 
       } else { 
        board[i][j] = fillNum; 
        exists = False; 
       } 
      } 
     } 
    } 
    return board; 
} 

私は「リターン・ボード」ラインでcompilcationエラー(赤サブライン)を持っています。

を使用せずに2次元配列を返す方法は、structs \ dynamic allocationですか?

私は2010年

+0

使用のmalloc、 –

+0

私はできません、これは宿題です..もし私ができるとすれば、私はそれをするでしょう。 – Billie

+1

あなたは良いです。現在、関数スコープの終了時にもはや有効ではないローカル変数を返しています。その未定義の振る舞い。 in-out paramは受け入れ可能ですか? – WhozCraig

答えて

13

誰かがどこかで、そしてもっと重要なのはそのボードのメモリを所有する必要があり、その所有権は、この関数の呼び出し元に戻って延びていなければならないのMicrosoft Visual C++ Expressを使用しています。動的割り当てがなければ、唯一の他の唯一の代替方法は、in/outパラメーターのように関数に送ることです。あなたの発信者からこのような

void generateBoard(size_t N, size_t M, int board[N][M]) 
{ 
    int i, j , fillNum; 
    Boolean exists = True; 
    // initilize seed 
    srand(time(NULL)); 
    // fill up.. 
    for(i = 0; i < N; ++i) { 
     for(j = 0; j < M; ++j) { 
      exists = True; 
      while(exists) { 
       fillNum = rand()%MAX_RANGE + 1; // limit up to MAX_RANGE 
       if(beenAdded(board, fillNum) == Exist) { 
        continue; 
       } else { 
        board[i][j] = fillNum; 
        exists = False; 
       } 
      } 
     } 
    } 
} 

と起動します。

int main() 
{ 
    const size_t N = 10; 
    const size_t M = 10; 
    int board[N][M]; 

    generateBoard(N,M,board); 

    ... 
} 

私もmain()に起動コードへsrand()コールをrelocatting検討します。理想的には、潜在的に繰り返し呼び出すことのできる関数には存在しないでください。を1回実行すると、プロセス実行ごとにが実行されることが保証されます。 (注:私は正直なところ、スレッドの実行であることを覚えていませんが、コーディングの学習曲線のこの時点で、私はマルチスレッドがまだレーダーにないと推測しています)。

最後に、ランダムフィルループは不必要に繰り返します。あなたがしようとしているものを生成するためのより良い選択肢があります:既存の数列のランダムな並べ替えを作成します。書かれているように、最後のいくつかのスロットを埋めるためにしばらくスピンすることができます。どれくらいの大きさでMAX_RANGE(N*M)と比較するかによって異なります。

+0

その値渡し... – muaaz

+1

@muaazその*配列*。その* value *は***アドレス***です。私。アドレスで渡され、それを実行するとそのことが実証されました。 – WhozCraig

+0

はい、それを持って....ありがとう... – muaaz

17

ローカル変数としてboardを定義しました。関数が範囲外になるとメモリが削除されます。

あなたはグローバルなボードを宣言することができ、またはあなたがそうのように動的に作成することができます。

int **allocate_board(int Rows, int Cols) 
{  
    // allocate Rows rows, each row is a pointer to int 
    int **board = (int **)malloc(Rows * sizeof(int *)); 
    int row; 

    // for each row allocate Cols ints 
    for (row = 0; row < Rows; row++) { 
     board[row] = (int *)malloc(Cols * sizeof(int)); 
    } 

    return board; 
} 

あなたが動的にボードを解放する必要があります。ボードの2次元配列の割り当てのための

// you must supply the number of rows 
void free_board(int **board, int Rows) 
{ 
    int row; 

    // first free each row 
    for (row = 0; row < Rows; row++) { 
     free(board[row]); 
    } 

    // Eventually free the memory of the pointers to the rows 
    free(board); 
}