Punteros y estructuras

Started by Arcontus, February 04, 2012, 12:44:05 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Buenas chicos,

tengo una duda sobre punteros en bennu.

Si creamos la siguiente estructura:


//Lista de path

TYPE OBJETOPATH
    int x, y;
    int *PID;
END

TYPE NODOPATH
    OBJETOPATH path;
    NodoPath *Siguiente, *Anterior;
END

TYPE LISTAPATH
    NODOPATH *Primero, *Ultimo;
    int elementos;
END

//Estructura mapa
TYPE mapa
    listapath lpath[5];
END


y definimos que una funcion recibirá como parametro el puntero de la estructura mapa ej:
FUNCTION AddObjetoPath (MAPA *mimapa, OBJETOPATH * objetoPath)


A ver, ahora la preguntita, que es un poco liosa:
¿Como puedo acceder al valor de la memoria de: "(*mimapa) --> lpath[0] --> (*ultimo) --> &(path)" ?

Yo lo estoy probando así, pero no estoy seguro de estar haciendolo bien, de hecho creo que lo estoy haciendo mal:
&((*mimapa.lPath[0].Ultimo).path)

He probado también así, que es como se me ocurre más correcto, pero no me compila:
&((*mimapa).lpath[0].(*ultimo).path)

Gracias de antemano.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

prueba quitando los & y los * y tambien los parentesis
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Quote from: SplinterGU on February 04, 2012, 01:27:29 PM
prueba quitando los & y los * y tambien los parentesis

Bueno, parece que funciona, pero entonces ¿como discrimino cuando acceder al valor de memoria y cuando al valor de la variable?

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

#3
tipo * lala;

"lala" es el valor del puntero

"lala.elemento"  es el valor del elemento señalado por el puntero

"*lala" o "lala[0]", es el contenido entero apuntado por "lala", esto es para por ejemplo:

tipo *lala, lele;

lele = *lala;
lele = lala[0];

no necesitas otra discriminacion

en C es lo mismo para acceder a elementos, salvo que te pide que uses -> o . segun el tipo de la variable, pero C tranquilamente podria usar un unico identificador para hacer la operacion, pero asi lo diseñaron.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Lo que comentas de C  es lo que me hace que me lie. Gracias por la explicación SplinterGU.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

lo imagine, se que si uno esta acostumbrado a C puede ser dificil entenderlo, pero realmente cuando uno usa -> o . lo que quiere es acceder al elemento apuntado por el puntero dentro de una structura, por ende, si lo pensamos es lo mismo, a fin de cuentas queremos acceder al elemento.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

buf, punteros y estructuras, otra asignatura pendiente que seguro que tiene que servir de mucho y echar un cable que no veas :O

Arcontus

Quote from: Futublock on February 05, 2012, 09:00:33 PM
buf, punteros y estructuras, otra asignatura pendiente que seguro que tiene que servir de mucho y echar un cable que no veas :O

Hombre, más que "servir de mucho" considero que es tán básico para poder programar que por ejemplo cualquier estructura de datos, pero en definitiva el uso de punteros se utiliza básicamente para 2 cosas, poder leer una variable/proceso/estructura/... desde cualquier parte del programa y poder modificar su valor.

Por ejemplo, cuando usas la funcion write_int o sus derivadas utilizas los punteros, ya que estás pasando mediante el uso de & la posicion de memoria de una variable. Si lo piensas un momento, entenderías que si no pasaras la dirección de memoria, sino el contenido de la variable, al cambiar la variable de valor no se actualizaría en el write_int. A esto es lo que se llama pasar parametros por valor o referencia. En el primer caso (parametros por valor) lo que quieres es operar con lo que valga una variable en un momento concreto y en el segundo caso (parametros por referencia) quieres operar con el contenido de la variable ya que te interesa obtener las actualizaciones cuando esta cambie de valor.
¿Se entiende?

Saludos!

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com