2009-04-06 20 views
10

i ve creado matriz bidimensional dentro de una función, quiero devolver esa matriz, y pasarlo a otra función en algún lugar ..cómo devolver dos dimensiones char array 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; 
} 

pero esto sigue dando me error

+0

¿Puede ser más específico acerca del error? –

+1

Debería usar char sin signo en su lugar, porque 201 no está dentro del rango de char. –

+2

Además, está devolviendo la dirección de la variable local. Si intenta acceder a él, su programa se bloqueará. – Naveen

Respuesta

11

Sí, vea lo que está haciendo allí es devolver un puntero a un objeto (la matriz llamada board) que se creó en la pila. La matriz se destruye cuando se sale del alcance, por lo que el puntero ya no apunta a ningún objeto válido (un puntero colgante).

Debe asegurarse de que la matriz esté asignada en el montón, utilizando new. El método santificado para crear una matriz dinámicamente asignada en C++ moderno es usar algo como la clase std::vector, aunque eso es más complicado aquí ya que estás tratando de crear una matriz 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

me da error en la segunda línea, dice " error de sintaxis: falta ';' antes '[' " – r4ccoon

+0

quita el soporte alrededor de la segunda línea, y funciona. char ** board = new char * [maxX]; al menos no me da error de compilación y error de salida – r4ccoon

+0

Sí, lo siento, no estaba sentado en un compilador y tuve que adivinar la sintaxis de esa línea. –

0

Debe volver char** vez de char*

+0

tratando de hacer esto, cambió mi definición de cuadrícula a char * placa [16] [10]; y la asignación a * placa [i] [j] = (char) 201; aún generar error de compilación – r4ccoon

2

Este enfoque no funcionará. Si devuelve un puntero a una variable local, se encontrará con un comportamiento indefinido. En su lugar, asigne una matriz en el montón con new y copie los datos en ella indexándola manualmente.

0

La respuesta simple a tu pregunta es char **.

Dicho esto, ¡NO LO HAGA! Su variable "board" no durará fuera de createBoard().

Use boost::multi_array y páselo como referencia a createBoard() o devuélvalo directamente (pero si lo hace, se copiará).

+0

lo siento, no puedo usar el marco de impulso. supone utilizar C++ básico – r4ccoon

2

Realmente recomendaría usar el vector STL <> o los contenedores boost/multi_array para esto.

Si debe usar matrices, le recomendaría usar un typedef para definir la matriz.

typedef char[16][10] TBoard; 

También podría volver

char** 

... pero entonces tendría que encasillado al tamaño correcto para indexar correctamente. C++ no admite matrices dinámicas de múltiples dimensiones.

También como otros han sugerido que no se puede devolver un objeto en la pila (es decir, la variable local)

+0

no puede utilizar boost framework, y no me han enseñado sobre vectores ... así que no puedo usarlo – r4ccoon

+0

Luego vaya con typedef (si tiene un tamaño de placa estática). –

0

No debe devolver un puntero a una funciones variables locales, porque este espacio se sobreescribe tan pronto como la función devoluciones.

El almacenamiento asociado con la placa está en la pila de la función.

11

El mejor enfoque es crear una clase de planchar y hacer la función ctreateBoard su constructor:

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

Para obtener información sobre cómo utilizar una clase tal, no hay sustituto para la lectura de un buen libro. Recomiendo encarecidamente Accelerated C++ por Andrew Koenig y Barbra Moo.

+0

¿cómo lo paso a otra función en otra clase? – r4ccoon

+0

Una manera simple sería marcar mSquares como público. Y pase las referencias al objeto Board a las funciones. –

+4

Una manera simple pero mala. –

1

No devuelva el puntero a una variable local, como se menciona. Si me obligaran a hacer lo que desea lograr, primero iría por std :: vector. Como no ha aprendido std :: vector, aquí hay otra forma:

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

debe ser "void createBoard (char (& board) [16] [10]);" (referencia a la matriz) – qwerty

+1

qwerty tiene razón: define su argumento como pass-by-value. Pásalo por referencia y todo funciona bien. – xtofl

+0

Ambos funcionan en Visual Studio 2008. Estoy confundido. ¿Qué pasa con mi implementación? ¿Cómo se pasa la matriz por valor? – Donotalo