Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Como llamar arrays 2d desde parametros?

Iniciado por Eskema, 15 de Septiembre de 2007, 08:22:57 AM

« anterior - próximo »

Eskema

Muy buenas gente, estoy haciendo un juego sencillo inspirado en la recreativa comandos (si la del año de la polka jejeje), bien tengo un ligero problemilla al cargar los mapas.
El juego es 2d asi q utilizo tiles para hacer mapas y los mapas son el tipico:

int mapa1[10][20] ={1,1,2,0,etc};

Asi q he hecho una funcion de tal forma q pueda pasarle el mapa q quiero dibujar en cada momento, sin embargo no se dibuja el mapa correctamente.

void DibujaMapa(Tile *obj, int mapa_an, int mapa_al, int nummapa,  int  ** mapa, SDL_Surface *salida)
{

   int indice = 0;
    int i = 0, j = 0;
    int x,y;
    int xtile, ytile, xpos,ypos;


switch (nummapa)

{
   case 1:

     for(i=0; i < (PANTALLAY/TILESIZE+1); i++){
      for(j=0; j < (PANTALLAX/TILESIZE+1); j++){



       xtile = mapa_an / TILESIZE;
       ytile = mapa_al / TILESIZE;

       xpos = xtile & (TILESIZE - 1);
       ypos = ytile & (TILESIZE - 1);

       indice = (int)&mapa[ytile+i][xtile+j];

       x=(j*TILESIZE) - xpos;
       y=(i*TILESIZE) - ypos;


       obj->x=x;
       obj->y=y;


    blitTile (obj, salida, obj->x, obj->y, indice);
   }
}
break;




Indice no es mas q un indicador para saber en cada pasada cual es el tile q tengo q dibujar,

Luego en el codigo hago una llamada asi para q dibuje el mapa,  pero nada, solo llena la pantalla con tiles sin importarle el mapa.

DibujaMapa(&TilesMapa, TilesMapa.mapx, TilesMapa.mapy, Niveles, &mapa1[10][20], pantalla);



¿Que hago mal?, saludos

tamat

Yo veo bastantes cosas chungas ahí, pero me decanto por esta:

DibujaMapa(&TilesMapa, TilesMapa.mapx, TilesMapa.mapy, Niveles, &mapa1[10][20], pantalla);

estas pasandole la direccion del elemento [10][20], no del array, ademas que eso se sale de la memoria porque ni existe la fila 10 ni la columna 20 (el ultimo es 9,19). Deberias poner &mapa1 a secas, que es la direccion del primer elemento.
Por un stratos menos tenso

Eskema

Gracias tamat, ya probe esa opcion tb pero no funciona, simplemente la pantalla se queda en negro, ademas de darme un warning: passing arg 5 of `DibujaMapa' from incompatible pointer type

¿Alguna otra sugerencia de q hago mal o como se debe hacer? :)

Pogacha

Por que en realidad no tienes que poner el &


DibujaMapa(&TilesMapa, TilesMapa.mapx, TilesMapa.mapy, Niveles, mapa1, pantalla);


Aparte que esto no va a andar nunca!

   indice = (int)&mapa[ytile+i][xtile+j];

tendras que pasarle un argumento row_width

   indice = (int)&mapa[(ytile+i)*row_width + xtile+j];

Y el int **mapa es otro error int* mapa es lo correcto.

Y seguramente hay mucho mas.

Saludos

tamat

lo que me sorprende es que todos esos errores no te los escupa el compilador.
Por un stratos menos tenso

Eskema

Tengo entendido q el argumento row-width seria para un mapa de formato 1d, sin embargo el mio es 2d luego no veo q necesidad hay de poner eso.
A no ser q para llamar a un array2d por parametros necesite tratarlo como uno de 1d.
Por si alguien tiene dudas, la funcion va perfecta si pongo el nombre del mapa, es decir si me dejo de parametros y pongo directamente en el indice el nombre del mapa en cuestion, mapa1, mapa2, etc,etc todo va sobre ruedas.
indice = nombre_mapa_que_quiero[ytile+i][xtile+j];
pero claro poner esto me obliga a tener un switch y todos los nombres de los mapas q vaya a utilizar.
El problema para mi, es como quitar el nombre y usar un parametro para llamarlo.

Saludos y gracias por vuestro tiempo  :D

tamat

La memoria de los ordenadores es lineal, eso significa que da igual qué tipo de datos intentes almacenar, siempre acaba guardandose de manera lineal. En el caso de una matriz 2D, el compilador lo que hace es que cuando pides el primer elemento de la segunda fila busca el elemento justo despues del ultimo de la primera fila.

Y aquí es donde tu tienes un problema, porque si tu pasas un array bidimensional de 10x20 y la funcion que lo recibe no tiene ni idea del tamaño de dicho array entonces le resulta imposible saber qué posicion de memoria ocupa el elemento [5][5] ya que eso va en funcion del ancho de dicho array.

Por eso C permite especificar el tamaño del array como tipo, es decir:
void mifuncion(int pepito[10][20]) { ... }

de esta manera él ya sabe como gestionar la memoria cuando le pidas algo.

De todos modos creo que tu deberias plantearte usar estructuras de datos, ya que es mucho más limpio.

Podrias tener algo así:

struct sMapa
{
char* nombre;
int ancho;
int alto;
int* matriz;
};

y luego cuando quieras pasar un mapa pues le pasas el puntero a la estructura de datos, y desde tu funcion te preocupas de moverte de manera coherente.
Por un stratos menos tenso

shephiroth

Buenas.

Aparte de lo ya comentado del beneficio de usar un struct (aunque para esto, mejor objeto) hay errores bastante feos ahi. Sobre el pq no se queja el compilador.....es una de las ventajas y la mayor desventaja de c....los punteros. No es lo mismo lo que quieres hacer que lo que hace, y el compilador solo distingue si lo que hay es coherente, en ningun caso distingue entre lo que quieres y lo que pones.

A continuacion errores posibles:
- Si mapa1 es int**, y en la llamada usas &, en la funcion recibes int*** en vez de int**, por lo q pierdes 1 nivel de direccionamiento.
- Lo mismo pasa con TilesMapa, si esta declarado como Tile* al usar & a la funcion llega Tile**, por lo q el objeto que llega a la funcion apunta a la tabla de indices, no a tu objeto real.
- "xtile & (TILESIZE - 1)" tanto en x como en y, no entiendo muy bien esto. Ese operador es binario y no me cuadra demasiado.
- "(int)&mapa[ytile+i][xtile+j]" Tal como esta puesto, siendo mapa int**, lo que estas cambiando a int no es el dato del array, sino su direccion. La indireccion & sobra....y te aconsejo para evitar desastres acotar siempre los casteos "((int)(mapa[ytile+i][xtile+j]))". Puede parecer un engorro, pero imaginate que en vez de casteo a int, es casteo a un objeto...donde pones los -> ??? Si te acostumbras a usar parentesis no dependeras de que el compilador adivine que quieres hacer.

SALUDOS ^^






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.