2009-04-06 18 views
10

i ve creato matrice bidimensionale all'interno di una funzione, voglio tornare tale matrice, e passarlo da qualche parte per altre funzioni ..come restituire il char array bidimensionale C++?

char *createBoard(){ 
    char board[16][10]; 
    int j =0;int i = 0; 
    for(i=0; i<16;i++){ 
     for(j=0;j<10;j++){ 
       board[i][j]=(char)201; 
     } 
    } 
    return board; 
} 

ma questo continua a darmi errore

+0

Puoi essere più specifico sull'errore? –

+1

Si consiglia di utilizzare invece il carattere unsigned char, perché 201 non è compreso nell'intervallo di char. –

+2

Inoltre, si sta restituendo l'indirizzo della variabile locale. Se si tenta di accedervi, il programma si bloccherà. – Naveen

risposta

11

Sì, vedere che cosa si sta facendo, restituisce un puntatore a un oggetto (l'array chiamato board) che è stato creato nello stack. L'array viene distrutto quando esce dall'ambito, quindi il puntatore non punta più a nessun oggetto valido (un puntatore pendente).

È necessario assicurarsi che l'array sia allocato nello heap, utilizzando new. Il metodo santificato per creare una matrice allocata dinamicamente nel C++ moderno è quello di utilizzare qualcosa come la classe std::vector, anche se è più complicato da quando si sta tentando di creare un array 2D.

char **createBoard() 
{ 
    char **board=new char*[16]; 
    for (int i=0; i<16; i++) 
    { 
     board[i] = new char[10]; 
     for (int j=0; j<10; j++) 
     board[i][j]=(char)201; 
    } 

    return board; 
} 

void freeBoard(char **board) 
{ 
    for (int i=0; i<16; i++) 
     delete [] board[i]; 
    delete [] board; 
} 
+0

mi dà errore sulla seconda riga, si dice " errore di sintassi: mancante ';' before '[' " – r4ccoon

+0

rimuove la parentesi attorno alla seconda riga e funziona. char ** board = new char * [maxX]; almeno non mi dà errore del compilatore e errore in uscita – r4ccoon

+0

Sì, mi dispiace, non ero seduto a un compilatore e dovevo indovinare la sintassi per quella linea. –

0

Si dovrebbe tornare char** invece di char*

+0

cercando di farlo, ha cambiato la mia definizione di griglia in char * board [16] [10]; e l'assegnazione a * board [i] [j] = (char) 201; genera ancora il compilatore errore – r4ccoon

2

Questo approccio non funzionerà. Se si restituisce un puntatore a una variabile locale, si verificherà un comportamento indefinito. Assegnare invece un array su heap con new e copiare i dati in esso manualmente indicizzandolo.

0

La semplice risposta alla tua domanda è char **.

Detto questo, NON FARLO! La variabile "board" non durerà fuori di createBoard().

Utilizzare boost::multi_array e passarlo come riferimento a createBoard() o restituirlo direttamente (ma se lo si fa, verrà copiato).

+0

mi dispiace, non posso usare boost framework. si supponga di utilizzare il C++ – r4ccoon

2

Mi piacerebbe davvero usare il vettore STL < o il contenitore boost/multi_array per questo.

Se è necessario utilizzare gli array, quindi si consiglia di utilizzare un typedef per definire la matrice.

typedef char[16][10] TBoard; 

Si potrebbe anche tornare

char** 

... ma poi si avrebbe bisogno di typecast alla dimensione corretta al fine di indicizzare correttamente. C++ non supporta matrici dinamiche a più dimensioni.

anche come altri hanno suggerito, non si può restituire un oggetto in pila (cioè variabile locale)

+0

di base non utilizzare il framework boost, e non mi hanno insegnato a proposito del vettore .. quindi non posso usarlo – r4ccoon

+0

Quindi andare con typedef (se si dispone di una dimensione di scheda statica). –

0

Non si deve restituire un puntatore ad un funzioni variabili locali perché questo spazio viene sovrascritto non appena la funzione ritorna.

La memoria associata alla scheda si trova nello stack della funzione.

11

L'approccio migliore è creare una classe di bordo e fare funzionare il ctreateBoard suo costruttore:

class Board { 
    private: 
    char mSquares[16][10]; 

    public: 
    Board() { 
     for(int i=0; i<16;i++){ 
     for(int j=0;j<10;j++){ 
       mSquares[i][j]=201; 
     }  
    } 

    // suitable member functions here 
}; 

Per informazioni su come utilizzare una tale classe, non v'è alcun sostituto per la lettura di un buon libro. Consiglio vivamente lo Accelerated C++ da Andrew Koenig e Barbra Moo.

+0

come faccio a passare ad altre funzioni su altre classi? – r4ccoon

+0

Un modo semplice sarebbe quello di contrassegnare mSquares come pubblico. E passare i riferimenti all'oggetto Board alle funzioni. –

+4

Un modo semplice ma cattivo. –

1

Non restituire il puntatore a una variabile locale, come già menzionato. Se fossi costretto a fare ciò che vuoi ottenere, per prima cosa andrei su std :: vector. Dal momento che non hai imparato std :: vector, ecco un altro modo:

void createBoard(char board[16][10]) 
{ 
    int j =0;int i = 0; 
    for(i=0; i<16;i++){ 
     for(j=0;j<10;j++){ 
       board[i][j]=(char)201; 
     }  
    } 
} 
+2

dovrebbe essere "void createBoard (char (& board) [16] [10]);" (riferimento all'array) – qwerty

+1

qwerty right: si definisce il proprio argomento come pass-by-value. Passa per riferimento e tutto funziona bene. – xtofl

+0

Entrambi funzionano in Visual Studio 2008. Sono confuso. Cosa c'è di sbagliato nella mia implementazione? Come viene passato l'array in base al valore? – Donotalo