2011-09-28 13 views
1

私はこの一日のまわりで私の頭をラップしようとしてきた時に与えられた大きさを取るために、固定の二次元配列を変更...ランタイム

は が、アイデアは私がこれまでに予定通りに動作しているコードです

私は変更する必要がありますtCell * cells[3][5];実行時に指定されたサイズを使用します。機能を維持するためには何を変更する必要がありますか?

typedef struct { 
    int active; 

} tCell; 

typedef struct { 
    tCell * cells[3][5]; 

} tGrid; 

// creates a grid and initialize all the cells to NULL 
tGrid *init_grid() 
{ 
    tGrid *grid= malloc(sizeof(tGrid)); 

    if(grid == NULL) 
     exit(127); // failed to malloc 

    int i, j; 
    for(i=0; i < 3; i++) 
    for(j=0; j < 5; j++) 
     grid->cells[i][j]= NULL; 

    return grid; 
} 

// adds a cell to the grid 
void add_cell(tGrid *grid) 
{ 
    tCell cell; 

    int y = rand() % 4; 

    if(grid->cells[0][y] != NULL) 
     exit(127); // cell is taken 

    cell.active = 1; 
    grid->cells[0][y] = &cell; 
} 

void remove_cell(tGrid *grid, int x, int y) 
{ 
    if(x < 0 || x > 3 || y < 0 || y > 5) 
     exit(127); // out of bounds 

    grid->cells[x][y]= NULL; 
} 

基本的には、init_gridをパラメータとしてxyを取る必要があります。

tGrid *init_grid(int x, int y); 

しかし、その後、どのように私はtGrid構造体の定義を変更できますか?これまでに試したことはコンパイルエラーです(例:tCell * cells[][];

若干関連したメモで、「tCell * cells[3][5];」をどのように読み上げていますか?

注:

  • これは私がコード
+0

非常に重要な質問は、「以前のANSI標準によって、あるいはgccがあなたを取り除くことができるように、c99標準に準拠していますか?」*最初と最後のケースでは、可変サイズの配列を使用できますこれは比較的簡単です。 2番目のケースでは、不必要に厄介ないくつかのフープを飛び越さなければなりません。 – dmckee

+0

配列をxとyのサイズにしたいですか? – SNpn

+0

これはスタックオーバーフローで殴られてしまったと言われています。 – dmckee

答えて

3

簡単にコンパイルするgccの4.1を使用しているCの質問

  • です。

    typedef struct { 
        int rows; 
        int columns; 
        tCell **cells; 
    } tGrid; 
    

    そして配分:

    tGrid *pGrid = (pGrid*)malloc(sizeof(tGrid)); 
    /* check results etc */ 
    pGrid->rows = rows; 
    pGrid->columns = columns; 
    pGrid->cells = (tCell**)malloc(sizeof(tCell*)*rows); 
    /* check results */ 
    do{ 
        pGrid->cells[rows-1] = (tCell*)malloc(sizeof(tCell)*columns); 
        /* check results */ 
    } while (--rows); 
    

    完了。

    それとも、あなたも行うことができます。代わりにdo-whileループの

    typedef struct { 
        int rows; 
        int columns; 
        tCell *cells; 
    } tGrid; 
    /*****whatever in the middle ***********/ 
    pGrid->cells = (tCell*)malloc(sizeof(tCell)*rows*columns); 
    

    。違いは、最初のケースでは、各行はメモリ内の別々の配列になります。これは、その事柄を扱う際に役立つかもしれません。

    もちろん、それぞれmallocの場合は、freeである必要があります。

  • +0

    私はremove_cellがx/yでセルを解放する必要があると仮定すべきですか? – apann

    +0

    2番目の考えでは、これはまったく同じではありません。my * cells [] []は、tCellの配列ではなくNULLポインタで初期化されたtCell構造体へのポイントの配列です(0 'の値で初期化されます)。 – apann

    +0

    @apannでは、別のレベルの間接参照を追加するだけです。 – littleadv