• Lunes 29 de Abril de 2024, 03:33

Autor Tema:  Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!  (Leído 1709 veces)

juanmx

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!
« en: Miércoles 3 de Diciembre de 2003, 05:40 »
0
Saludos a todos, espero me puedan ayudar con lo siguiente:

Tengo el siguiente arreglo bidimensional:
Código: Text
  1.  
  2. int map1[13][17]=  
  3. { {2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2},
  4. {2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2},
  5. {2,1,2,1,2,1,2,1,2,1,2,1,1,1,2,1,2},
  6. {1,1,1,3,2,1,1,1,1,1,1,1,2,1,2,1,1},
  7. {2,1,2,2,2,1,2,2,2,2,2,1,2,1,1,1,2},
  8. {2,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,2},
  9. {2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2},
  10. {2,1,2,1,1,1,2,1,1,1,1,2,1,1,1,1,2},
  11. {2,1,2,1,2,1,2,1,2,2,1,1,1,2,2,1,2},
  12. {1,1,1,1,2,1,1,1,1,2,1,2,2,2,1,1,1},
  13. {2,1,2,2,2,1,2,2,1,2,1,2,1,1,1,2,2},
  14. {2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,3,2},
  15. {2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2}  };
  16.  

y este apuntador:

Código: Text
  1. int **map;
  2.  

Ahora, como le hago para inicializar map, con los valores de map1??, imagino que saben que quiero hacer, usar el apuntador map en todo el programa y cuando quiera cambier el mapa solo lo inicializo con otro arreglo map2, y asi, como le hago??     :(     me urge!!!!!!!!

Gracias por su atencion a todos,
Saludos, Juan

Martin Candurra

  • Miembro activo
  • **
  • Mensajes: 36
    • Ver Perfil
Re: Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!
« Respuesta #1 en: Miércoles 3 de Diciembre de 2003, 10:27 »
0
Simplemente deberías hacer map = map1;

Las formas de manejar un puntero a puntero son varias, entre ellas:
*(*(map+x)+y) o map
  • ,[y], etc.

juanmx

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!
« Respuesta #2 en: Jueves 4 de Diciembre de 2003, 01:51 »
0
map=map1;

Gracias por la respuesta pero ya habia intentado eso y me sale el siguiente error:

warning C4047: '=' : 'int ** ' differs in levels of indirection from 'int (*)[17]'

Estoy usando el VisualC++

Saludos, Juan.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!
« Respuesta #3 en: Viernes 5 de Diciembre de 2003, 21:37 »
0
vamos a ver... int **map es un apuntador a un apuntaror a int, es cierto que un array es como un puntero, pues map1 contiene la direccion del primer elemento del array.
Una asignación array a puntero funcionará siempre y cuando se trate de un array de una dimensión:
int a[5], *b;
b=a;
Esta asignación será correcta, y b apuntará al primer elemento del array a.  Ahora bien, a la hora de crear un apuntador a un apuntador (**map) no significa que map apunte a un array bidimensional, sino que map apunta a una direccion de memoria donde se encuentra la direccion de un int (puede sonar lioso pero no lo es).  Imagínate si creasomos un array de 10 dimensiones y tuvieramos que crear un puntero con 10 asteriscos.... una pasada.
si por ejemplo mostrásemos map, veríamos que aparece la dirección de memoria del primer elemento del array, y si mostrasemos *map aparecería el valor del primer elemento del array, os muestro un ejemplo para que lo comprobeis:

int map1[5]={0,1,2,3,4};
int **map;

map=map1;
printf("%d",*map); //muestra el valor de la 1a posicion del array '0'
printf("%x",map); //muestra la direccion (en hexadecimal) del 1er elemto del array

He mostrado la dirección en hexadecimal para que la podais comparar con la que aparece en el debugger, para comprobarlo de otra manera podeis hacer "printf("%x",map1)" y os mostrará la dirección de memoria del primer elemento del array.  Como veis es posible utilizar un **map para apuntar a un array simple.
La solución al problema es sencilla, puedes hacer un apuntador simple al array de dos dimensiones y simplemente deberás saber que cada 17 elementos es una fila (los arrays se ordenan de manera lineal en memoria primero los 17 elemtos de la 1a fila, luego los 17 sigtes y así sucesivamente hasta 13).  Por tanto puedes moverte a través de un puntero que apunte a la primera posición del array sabiendo que a partir de esa posición habrá 17x13=221 posiciones.
En fin espero que te haya sido de ayuda... Un saludo
No hay tonto más molesto que el ingenioso.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!
« Respuesta #4 en: Viernes 5 de Diciembre de 2003, 21:50 »
0
Por cierto se me ha olvidado comentar que el warning de diferentes niveles de indireccion, lo dá porque el array no es de una dimensión, por tanto es como varios arrays apuntando cada uno a una posición desplazada la una de la otra 17 enteros... por tanto al hacer la asignación directa el compilador te avisa de que no estás especificando a cuál de las múltiples posiciones a las que apunta te refieres... Por defecto siempre asigna la posición
  • [0], que es en éste caso lo que buscamos... La manera de evitar el warning es hacer lo siguiente:


int map1={...}
int *map;

map=&map1[0][0];

Una vez definida la posición a la que nos referimos el warning desaparece. Un saludo
No hay tonto más molesto que el ingenioso.

juanmx

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Ayuda!!!!! Urgente!!!! Apuntadores!!!!!!
« Respuesta #5 en: Viernes 5 de Diciembre de 2003, 22:50 »
0
Gracias por la ayuda, ya solucione mi problema, buena explicacion carmamezo me quedo mas claro el uso de este tipo de apuntadores.

Saludos a todos, Juan  :rolleyes: