2012-12-30 12 views
15

Stworzyłem funkcję, która generuje planszę bingo i chcę zwrócić tablicę bingo.Jak zwrócić macierz (macierz 2D) z funkcji? (C)

jak się nie spodziewałem, to nie działa.

tutaj jest funkcja:

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

mam błąd compilcation (czerwona sublinii) na pokładzie linii "powrót".

jest sposób na zwrócenie tablicy 2D bez przy użyciu przydziałów \ dynamic \ dynamic?

używam Microsoft Visual C++ Express 2010

+0

użytkowania malloc na pokładzie alokacji tablicy 2D, –

+0

Nie mogę, to jest zadanie domowe ... gdybym mógł, zrobiłbym to ... – Billie

+1

Lepiej. W tej chwili zwracasz zmienną lokalną, która nie jest już ważna przy wychodzeniu z zakresu funkcji. Jego niezdefiniowane zachowanie. jest akceptowalny w paramacie? – WhozCraig

Odpowiedz

13

ktoś musi posiadać pamięć o tej płycie gdzieś, a co ważniejsze, że własność musi wystawać z powrotem do rozmówcy z tej funkcji. Bez alokacji dynamicznej jedyną realną alternatywą jest wysłanie jej do funkcji jak w parametrze wejściowym/wyjściowym.

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

i wywołać w ten sposób ze swojego rozmówcy:

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

    generateBoard(N,M,board); 

    ... 
} 

Chciałbym również rozważyć relocatting się srand() wywołanie kodu startowego w main(). Najlepiej byłoby, gdyby nigdy nie było w jakiejś potencjalnie powtarzalnej funkcji, i powinno być zagwarantowane, że zostanie wykonane tylko po wykonaniu na wykonanie procesu. (uwaga: szczerze mówiąc nie pamiętam, czy jest to jeden raz na wykonanie wątku, ale w tym momencie w twojej krzywej uczenia się kodowania przypuszczam, że wielowątkowość nie jest jeszcze na radarze).

Wreszcie, pętla wypełnienia losowego jest niepotrzebnie powtarzalna. Istnieją lepsze alternatywy generujące to, co najwyraźniej próbujesz zrobić: stworzyć losową permutację istniejącego zestawu liczb. Jak napisano, można było przez jakiś czas kręcić się, próbując wypełnić te ostatnie kilka slotów, w zależności od tego, jak dużo większy jest MAX_RANGE w porównaniu do (N*M).

+0

to przepustka według wartości ... – muaaz

+1

@muaaz Jest to * tablica *.Jego * wartość * to jego *** adres ***. To znaczy. jest przekazywany przez adres, a uruchomienie go to pokazałoby. – WhozCraig

+0

tak, rozumiem ... dzięki ... – muaaz

17

Zdefiniowałeś board jako zmienną lokalną - jego pamięć jest dealokowana, ponieważ funkcja wykracza poza zakres.

Można zadeklarować tablica globalna, czy można go utworzyć dynamicznie tak:

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

Trzeba będzie dynamicznie uwolnić Zarządu:

// 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); 
}