Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: SirLancelot53 en 24 Enero 2014, 00:32 AM

Título: Como retornar una matriz.
Publicado por: SirLancelot53 en 24 Enero 2014, 00:32 AM
Si tengo una matriz que saco de un archivo y quiero retornarla ¿como lo hago? ya que el return quedaría dentro de los ciclos for terminando la función antes de tiempo. así:

Código (cpp) [Seleccionar]
char crear_mundo (char**M, int f, int c, istream& a, int i, int j)
{
   for (i = 0; i < f; i++)
   {
       for (j = 0; j < c; j++)
       {
            a>>M[i][j];
       }
   }
   delete [] M;
}

int main()
{
    int i,j,f,c;
    ifstream a("archivo.txt");
    a>>f;
    a>>c;
    char **M = new char* [f];
    for (i = 0; i < f; i++)
    {
        M[i] = new char[c];
    }
    crear_mundo (M, f, c, a, i, j);
    return 0;
}


Porque si la retorno dentro del ciclo solo imprimiria el primer caracter del archivo, y lo que ocurre es que después debo modificar la matriz (cosa que no puedo hacer si está dentro del ciclo). Agradezco su ayuda y estoy atento a respuestas!!!!!!
Título: Re: Como retornar una matriz.
Publicado por: SirLancelot53 en 24 Enero 2014, 00:34 AM
Que pena, dentro de la función main() va:
cout << crear_mundo (M, f, c, a, i, j);
Título: Re: Como retornar una matriz.
Publicado por: amchacon en 24 Enero 2014, 01:49 AM
No tienes que retornar nada, los cambios que se hagan en la función cambiarán la matriz del main. Compruebalo tú mismo.

Ojo, esto solo ocurre con los vectores y matrices. No intentes hacerlo con una variable o con un objeto.
Título: Re: Como retornar una matriz.
Publicado por: SirLancelot53 en 24 Enero 2014, 02:19 AM
Pero cuando intento imprimir en pantalla la matriz dentro de la función main, me compila pero despues aparece error.
Título: Re: Como retornar una matriz.
Publicado por: rir3760 en 24 Enero 2014, 02:22 AM
Eso se debe a que la matriz la destruyes al final de la función "crear_mundo", a partir de ahí ya no puedes utilizar los datos leídos del archivo (no tiene sentido).

Siguiendo lo comentado por amchacon también debes eliminar los parámetros "i" y "j", en su lugar hay que declararlos como variables locales.

La función termina así:
Código (cpp) [Seleccionar]
char crear_mundo(char** M, int f, int c, istream& a)
{
   for (int i = 0; i != f; i++)
      for (int j = 0; j != c; j++)
         a >> M[i][j];
}


Un saludo
Título: Re: Como retornar una matriz.
Publicado por: SirLancelot53 en 24 Enero 2014, 02:26 AM
Pero entonces ¿como podría imprimir la matriz o modificarla dentro de la función main? Porque intento hacerlo así:

cout << M;

En main() pero el programa corre y luego sale error aún destruyendo la función al final de main().
Título: Re: Como retornar una matriz.
Publicado por: rir3760 en 24 Enero 2014, 03:33 AM
Cita de: SirLancelot53 en 24 Enero 2014, 02:26 AMPero entonces ¿como podría imprimir la matriz o modificarla dentro de la función main?
Honestamente no entiendo.

La matriz la modificas en la función "crear_mundo": en ella sobrescribes cada uno de sus elementos con un valor leído del stream "a", modificar la matriz en la función main no conlleva diferencia alguna y basta con utilizar dos bucles.

Y para imprimirla la operación es similar:
Código (cpp) [Seleccionar]
int main()
{
   ifstream a("archivo.txt");
   
   int f, c;
   a >> f;
   a >> c;
   
   char **M = new char* [f];
   for (int i = 0; i < f; i++)
      M[i] = new char[c];
   
   crear_mundo (M, f, c, a);
   
   // Imprimir la matriz
   for (int i = 0; i != f; ++i){
      for (int j = 0; j != c; ++j)
         cout << " " << M[i][j];
     
      cout << endl;
   }
   
   return 0;
}

Por ultimo antes de que la función main termine se debe liberar la memoria utilizada por la matriz mediante el operador new.

Un saludo
Título: Re: Como retornar una matriz.
Publicado por: SirLancelot53 en 24 Enero 2014, 04:07 AM
Gracias, ahora ya entiendo pensé que no eran necesarios los ciclos; muchas gracias.