Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Funcion llamando structura dinamic

Estas en el tema de Funcion llamando structura dinamic en el foro de C/C++ en Foros del Web. Hola buenas! tengo unas dudas respecto al tempo. Os comento tengo en el main una matriz dinamica **map; y llamo a una funcion que haciendo ...
  #1 (permalink)  
Antiguo 06/12/2012, 21:04
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 7 meses
Puntos: 0
Funcion llamando structura dinamic

Hola buenas! tengo unas dudas respecto al tempo.
Os comento
tengo en el main una matriz dinamica
**map;
y llamo a una funcion que haciendo una serie de calculos definidos por un archivo de texto externo define la matriz.
Pero no aconsiguo que me salga...me la define dentro de la funcion pero me he bloquedado y no se como ponersela de nuevo a mi matriz map.

AQUI el simple codigo de como lo hago, estoy seguro que se soluciona rapido.

Código:
int fichero:: cargar(, int **mat) //mat es la matriz **map que paso desde main
{
    int maxx=27,maxy=19;//definidos los tamaños de la matriz
    mat = new int *[maxy];
    for(int i = 0; i<maxy; i++)
        mat[i] = new int[maxx];
    
return 0
}
he simplificado la funcion para dejar solo la duda que tengo.. gracias! D
  #2 (permalink)  
Antiguo 07/12/2012, 11:18
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Funcion llamando structura dinamic

Solo tienes que añadir que por cada 'j' defina el valor de la celda; en este caso las 'i' son las filas y las 'j' las columnas:

Código:
    int **mat;    
    int maxx=27, maxy=19;
    int ctd = 0;
    
    mat = new int *[maxy];
    for(int i = 0; i < maxy; i++) {
        mat[i] = new int[maxx];
        for(int j = 0; j < maxx; j++) {
            mat[i][j] = ctd++;
        }
    }
He puesto un ejemplo con un contador; los valores de las celdas son los que (si he entendido bien) estan definidos segun unos calculos de un archivo externo.

Para cargar el contenido haras lo mismo: usaras un incremental 'i' entre 0 y 'maxy' para situarte en una fila, y para cada fila un incremental 'j' entre 0 y 'maxx' para situarte en la celda.

Recuerda que para borrar tienes que hacerlo fila por fila: para cada 'i' delete [] mat[i], y al final delete [] mat

Saludos
vosk
  #3 (permalink)  
Antiguo 07/12/2012, 12:40
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Funcion llamando structura dinamic

No, no es lo que quiero.
Con la funcion que he puesto...que solo faltaba llenar la matriz hecha con valores...
La duda que tengo es...

Desde la funcion llamo a la matriz dinamica que por ejemplo esta en el main...
si en main tengo
Cita:
int main()
{
int **map;
cargar(map);
}
int cargar(int **map)
...
Entonces le digo el tamaño de la matriz, luego la lleno..y finaliza la funcion
La duda esque...los valores de **map del main no se canvian...
Se que con una variable normal llamandola con la funciona con &variable
luego dentro de la funcion variaria el valor de variable
pero con doble puntero nose como hacerlo...
Quiero que al acabar la funcion la variable **map tenga el tamaño y los valores dichos en la funcion cargar

:/ mexi :D
  #4 (permalink)  
Antiguo 07/12/2012, 13:49
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Funcion llamando structura dinamic

Ok, tu pregunta es: como paso un array multidimensional por referencia (si googleas esta pregunta tal vez encuentres otras opciones)

Creo que no puedes enviar este tipo de arrays tal cual, debes especificar el tamaño como minimo de cada elemento

Código:
void cargar(int map[27][19]) {}
Personalmente la forma mas clara de hacerlo es dejar que la funcion de cargar los datos se ocupe de todo:

Código:
int **cargar(int maxx, int maxy) {
    int **mat;
    int ctd = 0;
    
    mat = new int *[maxy];
    for(int i = 0; i < maxy; i++) {
        mat[i] = new int [maxx];
        for(int j = 0; j < maxx; j++) {
            mat[i][j] = ctd++;
        }
    }
    
    return mat;
}


int **mat;
int maxx=5, maxy=3;
mat = cargar(maxx, maxy);
En la funcion de carga debes poner tambien las comprovaciones de error (por si te quedas sin memoria o no se que mas puede pasar), de esta forma en caso de error retornas nulo y en el main sabras si hubo algun error.

Saludos
vosk
  #5 (permalink)  
Antiguo 07/12/2012, 17:40
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Funcion llamando structura dinamic

Vale que desastre!
este ultimo comentario me ha abierto la inspiracion xD
canviare el metodo y hare que me devuelva la matriz dinamica
Tendre de hacer alguna chapuza ya que la funcion no podra devolver un return 1 si me da error pero bueno ya lo solucionare

gracias!
  #6 (permalink)  
Antiguo 08/12/2012, 11:45
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Funcion llamando structura dinamic

"...Tendre de hacer alguna chapuza ya que la funcion no podra devolver un return 1 si me da error..."

Si te da un error debes liberar la memoria bloqueada hasta el error y retornar NULL

Si quieres tener un mayor control de los errores que se producen debes implementar 'algo' (una struct, una clase, yo que se) para comunicarle un indice de error, de forma que cuando esta funcion o cualquier otra provoca un error (en este caso si retorna nulo) haces una llamada del tipo getlasterror para saber el ultimo indice de error logeado, y si te sobra tiempo puedes asignar cada indice de error con un texto para crear otra funcion del tipo getlasterrormessage. Y no es una chapuza ya que muchas api lo llevan.

Saludos
vosk
  #7 (permalink)  
Antiguo 09/12/2012, 16:42
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Funcion llamando structura dinamic

Ya le hechare un ojo.
LO que en esa funcion tengo diferentes comprovaciones devolviendo un return 1 en caso de error y diciendo el error
Lo que haciendolo de esta forma al tener la funcion
int **cargar()
solo me deja devolver una matriz dinamica xD
pero bueno me a quedado bastante bien al final
mexi de nuevo

Etiquetas: fichero, funcion, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:41.