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

[SOLUCIONADO] [C++] Como retornar arreglo bidimencional?

Estas en el tema de [C++] Como retornar arreglo bidimencional? en el foro de C/C++ en Foros del Web. Buenass, ando necesitando ayuda para terminar una función. Mi problema pasa por retornar un arreglo bidimencional. Les dejo el código para que me entiendan: Código: ...
  #1 (permalink)  
Antiguo 13/04/2013, 12:19
 
Fecha de Ingreso: octubre-2009
Mensajes: 84
Antigüedad: 15 años, 2 meses
Puntos: 0
Pregunta [C++] Como retornar arreglo bidimencional?

Buenass, ando necesitando ayuda para terminar una función. Mi problema pasa por retornar un arreglo bidimencional.

Les dejo el código para que me entiendan:

Código:
void Maps::cargarMapa (SDL_Surface *Pantalla, SDL_Surface *Tiles, int x, int y) {

	static int mapa [FILAS_MAPA][COLUMNAS_MAPA] = {
		0,0,12,12,12,12,12,12,12,12,0,0,
		0,0,24,24,24,24,24,24,24,24,0,0,
		0,0,12,12,12,12,12,12,12,12,0,0,
		0,0,24,24,24,24,24,24,24,24,0,0,
		0,25,25,25,25,25,25,25,25,25,25,0,
		0,36,48,48,48,48,48,48,48,48,36,0,
		0,0,36,48,48,48,48,48,48,36,0,0,
		0,0,0,36,48,48,48,48,36,0,0,0,
		0,0,0,0,36,48,48,36,0,0,0,0,
		0,0,0,0,0,37,37,0,0,0,0,0
};

		int i;
		int j;
		int fila = y / ALTO_TILE;
		int columna = x / ANCHO_TILE;

		for (i = 0; i < FILAS_MAPA; i++) {		  // Largo
			for (j = 0; j < COLUMNAS_MAPA; j++) { // Ancho
				imprimirMapa (
					Pantalla, Tiles, 
					mapa [fila + i] [columna + j],
					j*ANCHO_TILE, i*ALTO_TILE
					);
			}
		}


}
Necesito retornar mapa, intente con punteros pero no hubo caso o lo hice mal y eso que trate de varias maneras u.u.

---> Esto es para un juego, la matriz la necesito para detectar colisiones.

Saludos y espero que me puedan ayudar!
  #2 (permalink)  
Antiguo 13/04/2013, 12:41
Avatar de jariza  
Fecha de Ingreso: agosto-2003
Ubicación: Málaga
Mensajes: 1.449
Antigüedad: 21 años, 4 meses
Puntos: 10
Respuesta: [C++] Como retornar arreglo bidimencional?

Hola,

Puede que me esté equivocando pero, ¿una variable static declarada dentro de una función no es local a esta? Creo que se destruiría al finalizar la función y si la devuelves lo que tendrás será una dirección de memoria sin inicializar.

Creo que sería mejor que la declarases fuera y la tratases como una variable por referencia.

Un saludo :)
  #3 (permalink)  
Antiguo 13/04/2013, 13:28
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: [C++] Como retornar arreglo bidimencional?

Cita:
Iniciado por jariza Ver Mensaje
¿una variable static declarada dentro de una función no es local a esta? Creo que se destruiría al finalizar la función
No, precisamente la característica de las variables estáticas es que sus valores persisten después de finalizar la función.

No se pueden retonar variables bidimensional (ni unidimensional). Lo que tienes que hacer es copiar esos valores a otra variable bidimensional. Te lo explico con un ejemplo:

Código:
void Maps::cargarMapa (int Matriz[][]) {

	int mapa [FILAS_MAPA][COLUMNAS_MAPA] = {
		0,0,12,12,12,12,12,12,12,12,0,0,
		0,0,24,24,24,24,24,24,24,24,0,0,
		0,0,12,12,12,12,12,12,12,12,0,0,
		0,0,24,24,24,24,24,24,24,24,0,0,
		0,25,25,25,25,25,25,25,25,25,25,0,
		0,36,48,48,48,48,48,48,48,48,36,0,
		0,0,36,48,48,48,48,48,48,36,0,0,
		0,0,0,36,48,48,48,48,36,0,0,0,
		0,0,0,0,36,48,48,36,0,0,0,0,
		0,0,0,0,0,37,37,0,0,0,0,0
};

		int i;
		int j;

		for (i = 0; i < FILAS_MAPA; i++) {		  // Largo
			for (j = 0; j < COLUMNAS_MAPA; j++) { // Ancho
				Matriz = mapa[j][i];
			}
		}


}
Esto si funcionaría, al llamar la función se rellenaria:

Código:
int Matriz[FILAS_MAPA][COLUMNAS_MAPA];
cargarMapa(Matriz); 

// Matriz ya esta rellena
  #4 (permalink)  
Antiguo 13/04/2013, 13:49
 
Fecha de Ingreso: octubre-2009
Mensajes: 84
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: [C++] Como retornar arreglo bidimencional?

Cita:
Iniciado por amchacon Ver Mensaje
No, precisamente la característica de las variables estáticas es que sus valores persisten después de finalizar la función.

No se pueden retonar variables bidimensional (ni unidimensional). Lo que tienes que hacer es copiar esos valores a otra variable bidimensional. Te lo explico con un ejemplo:

Código:
void Maps::cargarMapa (int Matriz[][]) {

	int mapa [FILAS_MAPA][COLUMNAS_MAPA] = {
		0,0,12,12,12,12,12,12,12,12,0,0,
		0,0,24,24,24,24,24,24,24,24,0,0,
		0,0,12,12,12,12,12,12,12,12,0,0,
		0,0,24,24,24,24,24,24,24,24,0,0,
		0,25,25,25,25,25,25,25,25,25,25,0,
		0,36,48,48,48,48,48,48,48,48,36,0,
		0,0,36,48,48,48,48,48,48,36,0,0,
		0,0,0,36,48,48,48,48,36,0,0,0,
		0,0,0,0,36,48,48,36,0,0,0,0,
		0,0,0,0,0,37,37,0,0,0,0,0
};

		int i;
		int j;

		for (i = 0; i < FILAS_MAPA; i++) {		  // Largo
			for (j = 0; j < COLUMNAS_MAPA; j++) { // Ancho
				Matriz = mapa[j][i];
			}
		}


}
Esto si funcionaría, al llamar la función se rellenaria:

Código:
int Matriz[FILAS_MAPA][COLUMNAS_MAPA];
cargarMapa(Matriz); 

// Matriz ya esta rellena

Muy bueno tu ejemplo, una duda nunca pase por parametro una matriz para que sea rellenada. Lo hago como decis y me sale el siguiente error:

Código:
Error	5	error C2087: 'Matriz' : falta el subíndice
Hago esto:

Código:
	
int Matriz [FILAS_MAPA][COLUMNAS_MAPA]; 
maps.cargarMapa(Pantalla,tiles,0,0,Matriz);
y en la funcion hago como me dijiste:

- Parametros:
Código:
void Maps::cargarMapa (SDL_Surface *Pantalla, SDL_Surface *Tiles, int x, int y,int Matriz[][])
-Rellenar:
Código:
Matriz = mapa[j][i];
Capas son preguntas medias tontas pero no acostumbro a estas cosas D:



-----------------------------------------


Lo solucione, me habia olvidado de poner en Matriz los subíndices jaja, gracias por sus respuestas!.

Saludoss

Última edición por martin0290; 13/04/2013 a las 14:17

Etiquetas: int, matriz, retornar
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 14:03.