Problemas con variables (+ presentación)

Started by poletro, October 14, 2012, 02:42:58 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

poletro

Hola a todo el mundo.

Primero de todo me gustaría presentarme. Soy un estudiante de 20 años, de Barcelona, actualmente estudiando en Castellón (Comunidad Valenciana). Desde siempre me han gustado los videojuegos y, desde no hace tanto, me dedico a programar en mis tiempos libres. El tema es que, en Castellón, han decidido organizar un concurso de videojuegos programados en BennuGD y, con un par de compañeros, nos hemos puesto al lío. He intentado seguir, básicamente, los tutoriales de Trinit y he ido consultando mis dudas por google (la mayoría de las cuales me llevaban aquí, óbviamente). La cosa es que tenemos poco tiempo y he intentado apurar al máximo mis dudas, pero me he encallado en lo que probablemente sea una tontería y ya no puedo aguantar más. Ahí voy.

Mi problema reside en el ámbito de las variables constantes y globales. Tengo mi proyecto separado en diferentes documentos, con un proceso por documento, y un documento principal que carga los fpgs, el scroll, llama a los procesos "hero" y "enemy" y poca cosa más.
Empecé creando el proceso "hero" y perfeccionándolo al máximo. Dicho proceso, tenía sus variables constantes y todo iba viento en popa. Cree el proceso "animation" que, básicamente, anima las diferentes acciones del proceso "hero". "Hero" tenía un INCLUDE para el proceso "animation". Todo bien. "Enemy" también llama al proceso "animation" y, por lo tanto, tengo un INCLUDE para dicho proceso.

Ahí me empezaron a surgir errores que no he sabido solucionar. Mis suposiciones son que, ya que dos proyectos INCLUDEn el mismo proyecto (animation) con sus variables constantes declaradas en ese mismo proyecto, se redeclaran variables y eso me da error. Así pues, decidí crear las variables constantes en mi proceso principal (videogame), pero los procesos hijos (hero y enemy) no me las reconocen. He intentado crearlas tanto globales como constantes en cada uno de los procesos que creo apropiados, y nada.

Espero que me podáis echar una mano. Si necesitáis ejemplos más concisos o algún que otro pantallazo, intentaré postearlos los antes posible. Gracias de antemano.

TL;DR: explicación de variables globales/constantes y su rango entre procesos en diferentes documentos plzzzz

SplinterGU

bienvenido.

codigo de ejemplo con el error, por favor.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

poletro

#2
Más que solucionarme el error, me gustaría saber el rango de las variables y eso (he intentado buscar información pero no la he encontrado).

videogame.prg
...
GLOBAL
    _STAND = 1;
    _WALK = 2;
...
END
...
BEGIN
    hero();
...
END



hero.prg
...
PROCESS hero()
PRIVATE
    action = _STAND;
...
END


Sí, sé que en este caso no hay razón para que la variable sea global, pero bueno. :)


EDIT: woops. El error: Unknown identifier (token error: "_STAND")

SplinterGU

no, no, me refiero a codigo compilable completo, asi no puedo ver cual es el problema, ni darte una solucion... pero me suena que el problema es que estas usando variables antes de definirlas, o sea, antes que el compilador sepa que esa variable existe.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

poletro

Uhm, preferiría no postear gran parte del código (ya que, como he dicho, este proyecto se presentará a un concurso).
Por otro lado, a qué te refieres? No se supone que si declaro e inicializo las variables globales antes de llamar al proceso que las usa, el compilador ya tiene constancia de dicha variable?

SplinterGU

no es antes de llamar al proceso, sino que incluso el proceso que las usa las tiene que tener antes declaradas.

es como cuando tu lees un libro, donde hay objetos o personajes, si tu no los conoces antes de mano, cualquier referencia a los mismos en el libro antes de que los definan no sabran que o quienes son.

no postees tu codigo, pero pon un codigo de ejemplo, compilable donde muestre el error... pueden ser 2 o 3 funciones, con un solo codigo a=b; y return; pero que muestre el problema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

alex

#6
Bienvenido, el error si no pones más código ni pones en que línea tienes el error es dificil de averiguar, pero viene del lado que dice Splinter, el problema esta en que el compilador no sabe que es _STAND, el compilador lee el código en un cierto orden, y debe llegar a una linea del codigo sin haber inicializado la variable _STAND,
entonces tu error puede venir de eso, u otra cosa que no creo, nunca lo he probado yo a hacerlo como tu y no se, creo que en el bloque private no puedes poner que una variable privada es igual a una global, solo puedes poner que es igual a una cantidad,
asi que puedes probar a cambiar las lines y escribir esto:

Process hero()
private
      action;
...
end
begin
      action=_STAND;
...


Y suerte con el concurso

poletro

¡Buenos días! He intentado declarar la variable como privada e inicializarla en el bloque begin, pero da el mismo error. Gracias de todas formas. :)

Ejemplo de código:

videogame.prg
PROGRAM test;

INCLUDE "hero.prg";

import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_rand";
import "mod_grproc";
import "mod_text";
import "mod_scroll";
import "mod_say";

GLOBAL
_STAND = 1;
END

PRIVATE
int fpgHero;
int idHero;
BEGIN
set_mode(640,480,32,MODE_WINDOW);
fpgHero = load_fpg("./tests.fpg");

idHero = hero();

start_scroll (0,0,503,501,0,0);
scroll[0].camera = idHero;
END


hero.prg
import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_rand";
import "mod_grproc";
import "mod_text";
import "mod_scroll";
import "mod_say";

PROCESS hero()

PRIVATE
int action = _STAND;

BEGIN
LOOP

FRAME;
END
END


Error
C:\~\hero.prg :15: error: Unknown identifier (token error: "_STAND" ).
C\~\hero: doesn't exist or isn't version 7 DCB compatible

alex

has probado lo que te dije, porque no veo ningun otro error, y donde pones el include para hero(), lo debes de poner despues de las variables globales, y, yo le suelo poner extension .h, pero, creo que da lo mismo lo de la extension

poletro

Sí, lo he probado y da el mismo error. Acabo de probar poniendo el INCLUDE después de las variables globales y sigue dando el mismo error.  :(

alex

videogame
PROGRAM test;

import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_rand";
import "mod_grproc";
import "mod_text";
import "mod_scroll";
import "mod_say";

GLOBAL
_STAND = 1;
END

#INCLUDE "hero.h";

Process main()
PRIVATE
int fpgHero;
int idHero;
end
BEGIN
set_mode(640,480,32,MODE_WINDOW);
fpgHero = load_fpg("./tests.fpg");

idHero = hero();

start_scroll (0,0,503,501,0,0);
scroll[0].camera = idHero;
END


intenta probarlo algo asi,

hero.h
PROCESS hero()

PRIVATE
int action;
end

BEGIN
       action=_STAND;
LOOP

FRAME;
END
END


poletro

Ya lo he probado Alex. :) Sigue dando el mismo error.

alex

ok, creo que ya se donde tienes el error, estas intentando compilar hero.prg en vez de videogame.prg por eso te da error tambien de que no reconoce el arcivo como compatible (porque no tiene Main(), C\~\hero: doesn't exist or isn't version 7 DCB compatible) si es eso no te desesperes, solo hay que compilar el videogame.prg, por si acaso me equivoco, te adjunto dos archivos con el esquema que me has puesto antes (a mi estilo de programar con bennu) y tienes que compilar el que pone prueba.prg.

Nota: los archivos vienen en un .zip

SplinterGU

ahi esta el problema que te digo, tienes el include antes que el global... y por ende estas queriendo usar una variable que aun no fue declarada...

como lo puso alex, compila perfectamente... fijate que estes compilando el ejemplo de alex... ya no deberia darte error, de hecho a mi no me lo da...


splinter@splinter:~/tmp/hero> cat hero.prg
PROGRAM test;

import "mod_video";
import "mod_proc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_rand";
import "mod_grproc";
import "mod_text";
import "mod_scroll";
import "mod_say";

GLOBAL
        _STAND = 1;
END

#INCLUDE "hero.h"

Process main()
PRIVATE
        int fpgHero;
        int idHero;
end
BEGIN
        set_mode(640,480,32,MODE_WINDOW);
        fpgHero = load_fpg("./tests.fpg");

        idHero = hero();

        start_scroll (0,0,503,501,0,0);
        scroll[0].camera = idHero;
END

splinter@splinter:~/tmp/hero> cat hero.h
PROCESS hero()

PRIVATE
    int action;
end

BEGIN
    action=_STAND;
    LOOP
        FRAME;
    END
END

splinter@splinter:~/tmp/hero> bgdc hero.prg
BGDC 1.0.0 (Oct  6 2012 19:16:55)
Bennu Game Development Compiler

Copyright (c) 2006-2012 SplinterGU (Fenix/BennuGD)
Copyright (c) 2002-2006 Fenix Team (Fenix)
Copyright (c) 1999-2002 Jos� Luis Cebri�n Pag�e (Fenix)


File hero.dcb compiled (53903 bytes):

  Processes                     2
  Global data                1072 bytes
  Local data                  220 bytes
  Private data                 12 bytes
  Public data                   0 bytes
  Code                        212 bytes
  System processes            220
  Globals vars                 24
  Locals vars                  28
  Private vars                  3
  Publics vars                  0
  Identifiers                 641
  Structs                       7
  Strings                      25 (226 bytes)

splinter@splinter:~/tmp/hero>

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

poletro

Pues sí, el ejemplo de Alex va genial.
Aunque se me hace raro ya que, la primera vez que me lo dijo, puse el INCLUDE debajo de las globales y me seguía dando el error. La línia PROCESS main() la tenía también en mi código, lo que me faltaba cerrar algunos END que pensaba que eran opcionales (por ejemplo, el END de PRIVATE). Aún así, ahora me dice que me he dejado algún paréntesis por cerrar, pero bueno. Sigo investigando.
Muchas gracias.

PD: +1 karma para Alex.  :)