Como retornar una matriz.

Iniciado por SirLancelot53, 24 Enero 2014, 00:32 AM

0 Miembros y 1 Visitante están viendo este tema.

SirLancelot53

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!!!!!!

SirLancelot53

Que pena, dentro de la función main() va:
cout << crear_mundo (M, f, c, a, i, j);

amchacon

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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SirLancelot53

Pero cuando intento imprimir en pantalla la matriz dentro de la función main, me compila pero despues aparece error.

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

SirLancelot53

#5
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().

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

SirLancelot53

Gracias, ahora ya entiendo pensé que no eran necesarios los ciclos; muchas gracias.