Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Rein (K´)ah Al-Ghul on February 02, 2010, 06:31:57 PM

Title: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on February 02, 2010, 06:31:57 PM
Estoy con algo similar a esto:

struct estructura[3]
int datoInt = 0;
byte datoByte = 0;
Char datoChar = "";
String datoString = "";
end

...
Function MyFuncion( pointer punteroStructura)
private
int auxiliarNumerico = 1;
String auxiliarCadeja = "Hola Mundo";
end
BEGIN
*punteroStructura[1].datoInt = auxiliarNumerico;
*punteroStructura[1].datoString = auxiliarCadeja;

END


asi es como se usan los punteros a estructuras??
el tema de subinidices de las estructuras pasadas como punteros no se bien como es...
Title: Re: Funciones y punteros
Post by: Windgate on February 03, 2010, 12:09:31 AM
Uf vaya cacao y además hace meses que tuve mi gran batalla con los punteros en Bennu...

De momento te recomiendo:

1) Que la struct la definas como TYPE, de forma que crees un tipo de dato como int, char, string... Pero definido por tí, por ejemplo tp_estructura.

2) Con lo anterior, el parámetro de MyFuncion lo cambiaría por ( tp_estructura POINTER punteroStructura)

3) Si mal no recuerdo, con lo anterior desde dentro de MyFuncion puedes acceder con punteroStructura[1].datoInt sin necesidad del *

4) No me seas TROLAZO y no mezcles "estructura" Y "Structura" que terminarás loco :D

Espero serte de ayuda... Si te desesperas mucho empieza un .prg nuevo y haz una prueba ultra-mega-simple, con una struct con 2 campos nada más, cuanta más basura quites para probar el funcionamiento mejor. Y una vez lo resuelvas súbelo comentado y te introducimos un karma por donde ya sabes :o
Title: Re: Funciones y punteros
Post by: Drumpi on February 03, 2010, 01:02:33 AM
Es posible que tengas que meter todo lo de después del asterisco entre paréntesis:
*(punteroStructura[1].datoInt) = auxiliarNumerico;
Creo que así el compilador no se lia con sobre qué estas buscando el valor, dado que el índice entre corchetes también es una forma de referenciar al contenido de un puntero.
Title: Re: Funciones y punteros
Post by: Windgate on February 03, 2010, 11:58:58 AM
Razón tiene Drumpi, abusa del paréntesis, en lugar de:

*punteroStructura[1].datoInt

Pon:

(*punteroStructura)[1].datoInt
(*punteroStrctura[1]).datoInt

O lo que quieras expresar, ya que esas 2 expresiones son lo mismo ni de coña.
Title: Re: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on February 03, 2010, 06:58:03 PM
gracias a ambos...
kreo ya tener medio solucionado el tema este...

pero ahora me entra otra duda
si en una funcion recibo un puntero a una estructura (esta estructura es un array de estructuras y tiene otras estructuras dentro)
en una segunda funcion que recibe pointer tambien, no debo agregar pointer al pasar como parametro verdad??
Y si mando una de las substructuras como parametro???
Title: Re: Funciones y punteros
Post by: Windgate on February 03, 2010, 07:25:40 PM
Quotesi en una funcion recibo un puntero a una estructura (esta estructura es un array de estructuras y tiene otras estructuras dentro)
en una segunda funcion que recibe pointer tambien, no debo agregar pointer al pasar como parametro verdad??

No, a la otra función le el parámetro tal cual, aunque en la cabecera de la función sí que hay que especificar que recibe un pointer.

Si mandas una subestructura como parámetro tendrás que pasar el puntero a esa subescructura... Pruébalo, es cuestión de enredar un rato.
Title: Re: Funciones y punteros
Post by: Futu-block on February 24, 2010, 04:38:22 PM
Resubo este hilo ya que no me aclaro con el tema de las funciones...
por mas que lea el manual :(
Title: Re: Funciones y punteros
Post by: Windgate on February 24, 2010, 07:13:07 PM
Una función puede hacer lo mismo exactamente que un proceso, sólo veo 2 diferencias:

1) El proceso retorna un int con el id del proceso invocado, mientras que una FUNCTION puede retornar el valor que quieras.

2) Un proceso se invoca y ejecuta en paralelo con el resto de procesos, mientras que una FUNCTION bloque al proceso "padre" hasta que la FUNCTION termina.

Ejemplo de función que devuelve el resultado de una suma:

FUNCTION int sumar ( int a , int b )
BEGIN
   RETURN a+b;
END

Observa que antes del nombre de la función se especifica el tipo del dato que retorna, en este caso un int
Title: Re: Funciones y punteros
Post by: Futu-block on February 26, 2010, 10:58:32 AM
osea que una funcion es como un comprobante de algo, una orden que se dá para que realice una operacion (u otra cosa) y que te devuelva un valor ¿no?
Title: Re: Funciones y punteros
Post by: Windgate on February 26, 2010, 12:05:34 PM


También se les puede poner LOOP FRAME; END y asignarles un gráfico como a cualquier otro proceso, pero al bloquear al padre no es muy aconsejable... Sólo para submenús por ejemplo, aunque para eso hay otros métodos como las señales.
Title: Re: Funciones y punteros
Post by: Prg on February 26, 2010, 02:53:16 PM
creo que incluso el proseso puede retornar un valor si en su cuerpo no hay frames, la ventaja de la función es que aunque requieras algunos frames el padre se queda esperando el valor de retorno de la función, por lo tanto no continua su ejecución hasta que la función haya concluido.
Title: Re: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on May 04, 2010, 12:18:15 AM
Quote from: Windgate on February 03, 2010, 12:09:31 AM
Uf vaya cacao y además hace meses que tuve mi gran batalla con los punteros en Bennu...

De momento te recomiendo:

1) Que la struct la definas como TYPE, de forma que crees un tipo de dato como int, char, string... Pero definido por tí, por ejemplo tp_estructura.

2) Con lo anterior, el parámetro de MyFuncion lo cambiaría por ( tp_estructura POINTER punteroStructura)

3) Si mal no recuerdo, con lo anterior desde dentro de MyFuncion puedes acceder con punteroStructura[1].datoInt sin necesidad del *

4) No me seas TROLAZO y no mezcles "estructura" Y "Structura" que terminarás loco :D

Espero serte de ayuda... Si te desesperas mucho empieza un .prg nuevo y haz una prueba ultra-mega-simple, con una struct con 2 campos nada más, cuanta más basura quites para probar el funcionamiento mejor. Y una vez lo resuelvas súbelo comentado y te introducimos un karma por donde ya sabes :o
revivo el tema
sin tener q declarar la estructura como tipo de dato no se puede mandar a una funcion el puntero a la estructura??
Title: Re: Funciones y punteros
Post by: Windgate on May 04, 2010, 12:08:10 PM
No sé responderte, siempre uso TYPE...
Title: Re: Funciones y punteros
Post by: SplinterGU on May 04, 2010, 03:15:01 PM
Quote from: Rein (K´)ah Al-Ghul on May 04, 2010, 12:18:15 AM
Quote from: Windgate on February 03, 2010, 12:09:31 AM
Uf vaya cacao y además hace meses que tuve mi gran batalla con los punteros en Bennu...

De momento te recomiendo:

1) Que la struct la definas como TYPE, de forma que crees un tipo de dato como int, char, string... Pero definido por tí, por ejemplo tp_estructura.

2) Con lo anterior, el parámetro de MyFuncion lo cambiaría por ( tp_estructura POINTER punteroStructura)

3) Si mal no recuerdo, con lo anterior desde dentro de MyFuncion puedes acceder con punteroStructura[1].datoInt sin necesidad del *

4) No me seas TROLAZO y no mezcles "estructura" Y "Structura" que terminarás loco :D

Espero serte de ayuda... Si te desesperas mucho empieza un .prg nuevo y haz una prueba ultra-mega-simple, con una struct con 2 campos nada más, cuanta más basura quites para probar el funcionamiento mejor. Y una vez lo resuelvas súbelo comentado y te introducimos un karma por donde ya sabes :o
revivo el tema
sin tener q declarar la estructura como tipo de dato no se puede mandar a una funcion el puntero a la estructura??

podrias ser mas especifico? no me quedo claro a que te referis con enviar.
Title: Re: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on May 04, 2010, 03:39:25 PM
tengo una structura como privada
y quiero mandarla como parametro a una funcion mediante un puntero...

sin tener q definirla con un type y luego usar ese tipo de dato definido, como en el ejemplo de wind

Title: Re: Funciones y punteros
Post by: SplinterGU on May 04, 2010, 03:53:00 PM
podes devolver punteros a esa estructura, pero el proceso que la recibe tiene que conocer el formato y ademas, si el proceso que la creo muere, entonces la estructura deja de existir tambien, a menos que la crees con malloc.
Title: Re: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on May 04, 2010, 05:13:35 PM
entonces puedo tener la estructura como global y trabajarla como privada mediante punteros...
Title: Re: Funciones y punteros
Post by: Drumpi on May 04, 2010, 07:51:17 PM
Si la tienes como global, no necesitas trabajar con punteros ;)
De todas formas, usa type y te quitas la mitad de los problemas, sobre todo si trabajas con copias en lugar de punteros.
Title: Re: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on May 05, 2010, 07:52:29 PM
Quote from: Drumpi on May 04, 2010, 07:51:17 PM
Si la tienes como global, no necesitas trabajar con punteros ;)
De todas formas, usa type y te quitas la mitad de los problemas, sobre todo si trabajas con copias en lugar de punteros.
se accede a los datos de forma mas rapida...
Title: Re: Funciones y punteros
Post by: Rein (K´)ah Al-Ghul on May 08, 2010, 07:47:57 PM
revivo el hilo...

si tengo un tipo de dato propio como un array bidemensional y lo quiero pasar como puntero, que deberia acer??

seria posible usar un array de punteros que apunten a las ubiciaciones iniciales mi tipo de dato??
Title: Re: Funciones y punteros
Post by: Windgate on May 09, 2010, 01:43:41 PM
Te recomiendo que mires el hilo llamado "Pasar matrices como parámetro" o algo así, allí se fue exponiendo todo, el único "problema" es que pasas un puntero al array, y que debes acceder a las "celdas" calculando el offset desde el puntero, algo así como:

mi_jodido_array [ fila + columna*anchura ]

Y el array de punteros sí que se puede hacer, trabajé los punteros en Bennu hasta la saciedad con un proyecto y tengo claro que se puede hacer todo lo que se puede hacer en cualquier otro lenguaje que los tenga.
Title: Re: Funciones y punteros
Post by: Drumpi on May 09, 2010, 07:03:31 PM
Como ya le dije por msn, la fórmula sería más bien:

mi_jodido_array[(fila*anchura)+columna]

Aunque claro, yo leo las tablas de izquierda a derecha y de arriba a abajo, en ese orden ^^U