Variable pública

Started by FPintaluba, June 04, 2010, 04:55:20 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Cierto, a mí también me pareció extraño eso de tener que pre-declarar cada proceso que usa PUBLIC.

Al final y con todo, los usos de PUBLIC que he hecho han sido más bien pocos :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

nada de esto es extraño...

me parece que estoy entendiendo que no tienen en claro el uso de type y no type.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

No digo extraño, me refiero a "menos usable de lo habitual", y es que Bennu es muy usable xD

De todas formas me gustaría que nos hablases del uso de type y no type, que en este foro todos los días se aprende algo nuevo :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

#18
los procesos que se escriben son las definiciones = tipos

las instancias son las ejecuciones de dichos procesos = id

si uno usa type esta identificando a (o a cualquier de) los procesos en ejecucion de un tipo determinado

si uno no usa type, esta referenciando a un proceso en concreto (id)

el type solo funciona en combinacion para algunas funciones.


Muchos lenguajes necesitan declaraciones de sus prototipos, metodos, propiedades. Esto no es cuestion de usabilidad o no, es cuestion de ser correcto y ordenado programando o no, por otro lado, no hay que escribir el prototipo 800 veces, con 1 vez alcanza y sobra.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Esa diferencia entre type y no type sí que la tenía clara, pensaba que ibas a relacionar type con PUBLIC y ahí me habías descolocado un poco :P

Entonces Splinter, ¿Sería complicado conseguir que la declaración de variables PUBLIC se hiciese de la misma forma que PRIVATE sin tener que usar DECLARE? Por ejemplo:

PROCESS mordisquitos ( )
PUBLIC
   int numero_dientes;
PRIVATE
   int puntos_de_vida = 100;
BEGIN
   ...
END


Ya sé que no cuesta nada ponerlas una vez y que es muy ordenado tener declaraciones, pero opino que sería más cómodo permitir algo "similar" a lo anterior.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

no, no se puede, porque eso implicaria muchos cambios, una compilacion en 2 pasos por ejemplo, y actualmente no es posible.

pensemos un poquito, con logica, sin necesidad de conocimientos internos de bennu:

1) variables privadas, se usan dentro de una funcion, y la definicion de estas variables estan antes del codigo de las usa (se definen antes de usarlas).

2) variables publicas, son variables que pertenecen a otra funcion, pero que tenemos acceso a ellas, entonces estas variables pueden estar definidas despues de que las referenciemos en nuestra funcion, entonces si desconocemos su definicion, no vamos a poder generar el codigo correcto para usarlas, por ende, si las necesitamos antes de la funcion a las que pertenecen, entonces debemos declararla (resumen, se definen antes de usarlas).

no solo las funciones que tienen variables publicas se pueden definir con declare, sino cualquier funcion/proceso, y esto es recomendable, porque se evita la carga extra de codigo que en algunos casos significa la autoconversion de datos.

por otro lado, si las funciones/procesos aparecen escritos antes de llamarlas desde otra funcion, entonces no necesitan ser declaradas.

estos temas ya se hablaron hace tiempo.

creo que en algun momento me voy a tener que dedicar a barrer el foro y hacer un FAQ de las cosas que se preguntan y responden frecuentemente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

Entonces según lo que dices, ¿actualmente es posible tener ficheros de declaración puros y duros separados de ficheros de definición en Bennu? No lo había visto en ningún tutorial antes (tampoco es que haya leído muchos...)

A partir de hoy cambia completamente mi forma de programar en Bennu :P Y ahora como me digas que se pueden definir funciones como si los procesos fuesen objetos, me da un patatús de alegría :D

SplinterGU

o te equivocaste al redactar el texto o no te entendi nada... podrias reformular la pregunta?

y lo de objetos tampoco lo entendi? algunas cosas las podes ver como objetos perfectamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

#23
Jejeje. Lo de separar me refería a separar en plan .c y .h

Este sería "protagonista.hpp"
[code language="bennu"]
DECLARE PROCESS protagonista(string name, int life)
   PUBLIC
       string nombre;
       int vida;
   END
   PRIVATE
       int x_anterior;
       int y_anterior;
   END
END

DECLARE FUNCTION float multiplicar(float x, float y)

// Resto de declaraciones de procesos y funciones

[/code]

Y este sería "protagonista.cpp"

[code language="bennu"]
INCLUDE "protagonista.hpp"

PROCESS protagonista(string name, int life)
BEGIN
   nombre = name;
   vida = life;
END

FUNCTION float multiplicar(float x, float y)
BEGIN
   return(x * y);
END

// Resto de definiciones de procesos y funciones
[/code]


Y lo que decía de objetos me refería a algo así:

[code language="bennu"]
// Declaración
DECLARE PROCESS fecha(int dia, int mes, int anyo) // Declaración de constructor
   PUBLIC
       int day;
       int month;
       int year;
       FUNCTION int esValida();
       FUNCTION int esAnyoBisiesto();
   END
   PRIVATE
       int aux;
       FUNCTION int aux(int p1, int p2);
   END
END

//Definición
PROCESS fecha(int dia, int mes, int anyo)
BEGIN
   day = dia; month = mes; year = anyo; // Implementación del constructor
   LOOP // Bucle principal
       FRAME;
   END
FUNCTION esAnyoBisiesto()
   BEGIN
       return(...);
   END
...
ONEXIT
   // Implementación del destructor
END

//Uso
BEGIN
   fecha hoy;
   hoy = fecha(1, 2, 2010);
   IF (hoy.esAnyoBisiesto())
       say("Bisiesto!!!");
   END
END

[/code]

SplinterGU

claro que es asi lo de los .h.

lo de los objetos, se puede hacer pero no de esa forma y las funciones dentro de un proceso son solo de ambito privado a la funcion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

Y como se haría lo de los objetos???

Declarando una función normal y metiendo el objeto como un parámetro? (que es como lo hacía yo hasta ahora)

SplinterGU

los procesos pueden tener funciones que son privadas a el, estas se definen con etiquetas, y se usan con la funcion del lenguaje call/gosub, y se retorna de ellas con return, estas funciones comparte en area de datos con el proceso, asi que cualquier variable que modifiques modificas las del mismo proceso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

osk

No conozco "gosub" (en la wiki no está) pero el uso de call y las etiquetas...¿no es volver al código spaguetti?
Siempre se dice en los manuales de programación que hay que huir del goto...
Aunque si es la única manera si simular un objeto, pues bienvenido sea...
Venga, hasta luego

SplinterGU

el problema del goto no es usarlo, sino usarlo mal.

la cosa es que en lineas generales hay malos programadores y muy pocos buenos, asi que conociendo esto es sugerible no usarlo, por eso mismo hay poca documentacion al respecto de estas funciones en bennugd, pero si preguntan obtendran respuestas, ahora si estas respuestas son aconsejables a todos o no, eso es otra cosa.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Por otras palabras, Splinter no sabe usarlo bien  ;D