Include, variables publicas y el error " Unknown identifier"

Started by c0rrupt_gamer, February 23, 2011, 11:33:39 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

c0rrupt_gamer

Hola a todos.

sigo avanzando en mi proyecto final de carrera y, como no, me he topado con otro error al cual no encuentro solucion, os paso a explicar.

Mi codigo ya empezaba a tener un tamaño considerable, haciendo que fuera algo tedioso encontrar una seccion concreta de codigo. por ello decidi coger partes del codigo y meterlas en archivos *.inc, para luego incluirlos en el codigo fuente principal.

Uno de estos archivos *.inc de momento solo contiene una funcion aun sin terminar. En dicha funcion accede a las variables publicas de un proceso, la ID del cual se le ha pasado como parametro. Sin embargo al intentar acceder a dicha variable salta el siguiente error:
IA.inc:8: error: Unknown identifier ("ESTADO")


aqui el contenido de IA.inc. soldado es la id del proceso que llama a la funcion, los posibles valores de la variable estado son constantes definidas en el codigo principal:
Function IA_menor (bool aliado, int soldado)
private
int enemigo=0;
int obstaculo=0;
end
begin
switch (soldado.estado)
case en_espera:
if (aliado)
enemigo = get_id(type puntero);  //de momento se usara el puntero como enemigo.
while (enemigo !=0)
if (fget_dist(soldado.x,soldado.y,enemigo.x,enemigo.y)< rand(700,1000))
estado= avance_hacia_enemigo;
end
enemigo=get_id(type_enemigo);
end
else
xadvance(0,4);
if (obstaculo=collision(type elemento))
if (obstaculo.tipo_elemento==1)
xadvance(180000,4);
saltando=true;
end
end
end

end
case avance_hacia_enemigo: end
case atacar: end
end
end


Aqui parte del codigo del proceso que llama a dicha funcion. Este proceso esta en su propio fichero elemento.inc , os lo pongo algo resumido:
Process elemento (int fpg, int num_bloque, int tipo)
Private

...

Public
bool locked = false;
int graph_inicial=0;
bool modo_ghost = true;
int xscroll=0;
int tipo_elemento=0; //variebale que identifica el tipo de elemento. 1=terreno, 2=soldado
bool saltando_derecha=false; //indica si el elemento esta saltando, obviamente solo se usra si el elemento es un soldado
bool saltando_izquierda=false;
int estado = en_espera;
begin
file=fpg;
     
       ...
   
       if (graph_inicial==graph_blob)
IA_menor(true,id); //IA_menor le indicara que hacer al elemento si este es un blob o un zorro.
end



En el codigo principal elemento.inc esta incluido antes que IA.inc.

Pues lo dicho, que tras muchos intentos no consigo que me compile bien, porque al llegar al fichero IA.inc el compilador no entiende a que viene la linia soldado.estado ...

Alguna idea de en que me he equivocado?


Saludos

PD: estoy en proceso de ordenar el codigo que tengo, ahora mismo es un poco...  engorroso




panreyes

Creo que para utilizar publics de esa forma tendrás que declarar los procesos antes, cosa que yo nunca he llegado a hacer la verdad...

Yo creo variables locales, que serán comunes a todos los procesos. Menos ahorro de memoria, pero más práctico :D

Por cierto, ¿y en qué carrera te permiten desarrollar un videojuego en Bennu como proyecto? xD

c0rrupt_gamer

no, declarar el proceso elemento no soluciona el error...


Estoy cursando Ingenieria tecnica en informatica de sistemas, en la UAB. El profe que tengo asignado como director de proyecto la verdad es que suda un poco. De vez en cuando le enseño lo que tengo hecho, pero por lo demas me deja hacerlo todo a mi manera xD

Saludos

SplinterGU

Si te enseña BennuGD seguramente es alguien conocido, por eso te preguntaba el nombre.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

claro que no te va a funcionar... soldado no puede ser int... debe ser de tipo elemento... por ejemplo...

elemento soldado;

por otro lado, me parece que no se puede definit una variable tipo proceso dentro de un parametro.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

c0rrupt_gamer

soldado no es una instancia del proceso elemento, es la id de la instancia del proceso elemento que ha llamado a la funcion, y las ids de los procesos son de tipo int. Pensaba que podria acceder a sus variables publicas a traves de su id...


Bueno, como no encuentro solucion, probare a pasarle a la funcion un puntero a la variable estado como parametro, a ver si cuela.

PD: que los datos tipo bool no existen? pues yo la uso y me funciona xDDD asi a voz de pronto tengo unas 6 variables globales de tipo bool, y hasta la fecha no handado problemas...

SplinterGU

Quote from: c0rrupt_gamer on February 25, 2011, 06:34:14 PM
soldado no es una instancia del proceso elemento, es la id de la instancia del proceso elemento que ha llamado a la funcion, y las ids de los procesos son de tipo int. Pensaba que podria acceder a sus variables publicas a traves de su id...


Bueno, como no encuentro solucion, probare a pasarle a la funcion un puntero a la variable estado como parametro, a ver si cuela.

PD: que los datos tipo bool no existen? pues yo la uso y me funciona xDDD asi a voz de pronto tengo unas 6 variables globales de tipo bool, y hasta la fecha no handado problemas...

exacto, por eso no debe ser int, debe ser declarada del tipo "elemento", en vez de int pone "elemento", ahi va a funcionar.

no, no, el dato bool no existe, el compilador interpreta que es un dato de un tipo que aun no se define, y por ende lo define como int, pero esta mal, no debes usarlo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

c0rrupt_gamer

si cambio el segundo parametro de la funcion IA_menor a elemento, como hago la llamada desde el proceso?

IA_menor(true,id) falla porque le estoy pasando un entero, no un proceso.

SplinterGU

por favor, hazme caso...

esto se explico infinidad de veces... cuando uno quiere acceder a variables publicas de un proceso, tiene que especificar el contenedor para que el compilador sepa de que se trata... cuando uno define una variable de un tipo proceso, no esta deciendo que la variable es un proceso, sino esta deciendo que el valor de id contenido en esa variable apunta a un proceso de un tipo especifico, la variable sigue siendo int internamente, pero a nivel de codigo es un contenedor de datos del proceso que referencia.

por favor, usa la opcion buscar y pon "variables publicas" o "publics" o "declare", y ahi encontraras mas referencias.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

El dato que entra por parámetro es un int, pero luego debes asignarlo a una variable cuyo tipo sea el nombre del proceso (sin paréntesis) del que va a leer las variables públicas.

Tal como está hecho el sistema, la única forma para que el proceso que lee las públicas sepa en qué dirección mirar, es teniendo de antemano un "índice" de donde está cada una, y eso sólo lo sabe el proceso dueño, de ahí que la variable no sea del tipo int, sino, en tu caso, "elemento".
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

#11
te voy a poner un ejemplo


import "mod_say";
import "mod_proc";

process pub()
public
    a;
begin

    a = 1234;

    loop
        frame;
    end

end

process test( pub proc )
begin


    say(proc.a);

end



begin
    test(pub());

    let_me_alone();

end


ahora se entiende?

o


import "mod_say";
import "mod_proc";

process pub()
public
    a;
begin

    a = 1234;

    loop
        frame;
    end

end

process test( pub proc )
begin


    say(proc.a);

end



private
    int p;

begin

    p = pub();   
    test(p);

    let_me_alone();

end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

c0rrupt_gamer

Al final he declarado el proceso elemento y la funcion IA_menor en el codigo principal (tambien he cambiado todas las variables bool por int).

ya funciona con normalidad, muchas gracias a todos.  En breve abriré mas temas con mas problemas, seguro...

Saludos