Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Danielo515 on December 14, 2008, 01:42:24 PM

Title: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 01:42:24 PM
Si tengo declaradas estas variables como publicas
[code language="bennu"]declare process proceso(int inst_bloq,int t_ej,t_bloq,char bloq)
public
int pos,ejec;
proceso delante,detras,escaneo;
end
end[/code]

¿porque cuando voy a acceder a ellas me da error en esta línea?
me da este error

librender:0: warning: Variable redeclared ("ALPHA_STEPS")
C:\Bennu\bin11\diagrama.prg:53: error: Unknown identifier ("POS")

[code language="bennu"]while(escaneo=get_id(type proceso))
   if(escaneo.pos < id.pos) delante=escaneo end
end[/code]

Title: Re: Problema accediendo a variables locales
Post by: panreyes on December 14, 2008, 02:15:57 PM
+1

A mí también me ha ocurrido, aunque sin declarar y en vez de utilizar "públicas" utilicé "locales".
pd: no entiendo la diferencia xD
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 14, 2008, 02:49:32 PM
escaneo de que tipo es?

siempre que muestren algun supuesto error, tiene que poner el codigo completo o todas las lineas que tengan relacion con las lineas mencionadas... esto es, declaraciones, lineas que afecten directa o indirectamente a variables usadas en el supuesto error...

seguro que escaneo la tenes declarada como int... si es asi, ya se explico varias veces que tenes que declararla como el tipo del proceso que las contienen, en tu caso 'proceso'...
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 02:58:54 PM
Splinter, si te fijas desde un principio he puesto todas las líneas que tienen que ver. Supongo que se te habrá pasado, pero en el primer bloque de código viene escaneo como una variable del tipo proceso declarada como publica dentro de la definición del mismo.
GRacias.
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 14, 2008, 03:07:00 PM
no podes declarar una variable "procesoX" como publica de "procesoX" ya que aun las variables de tipo publico no fueron compiladas, entonces no estan resueltas...
y tampoco estoy seguro que puedas definir dentro de un "procesoX" una variable que referencie a si mismo...
es mas, deberia fallar...
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 03:19:37 PM
He probado poniendolo en private y me sigue dando el mismo error. Ademas que lo que dice es unknow identifier pos, y no entiendo el motivo.
No se a que te refieres con poner una variable proceso que se referencie a si mismo. Esa variable será para almacenar procesos hermanos, que no siempre tienen por que ser el hermano mayor o menor, puede haber muchos hermanos. Es algo así como para hacer una lista enlazada de procesos.
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 14, 2008, 03:31:41 PM
ah, no, ya se cual es el problema...

solo la primer variable es de tipo proceso, las demas son int...

pone esto:

declare process proceso(int inst_bloq,int t_ej,t_bloq,char bloq)
public
int pos,ejec;
proceso delante;
proceso detras;
proceso escaneo;
end
end
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 03:42:28 PM
No se, Me sigue arrojando el mismo error....
Aquí tienes el codigo completo, porsiacaso...
[code language="bennu"]//include"gui.inc"
#define ancho 640
#define alto 480
#define amarillo rgb(100,100,158)
#define rojo rgb(200,10,10)
import "mod_mouse";
import "mod_rand";
import "mod_text";
import "mod_proc";
import "mod_grproc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_math";
import "mod_screen";
import "mod_video";

declare process proceso(int inst_bloq,int t_ej,t_bloq,char bloq)
public
int pos,ejec;
proceso delante;
proceso detras;
proceso escaneo;
end
end


global
int procesos;
proceso ultimo;

begin
set_mode(ANCHO,ALTO,16);
write(0,100,20,4,"Procesos creados:");
write_var(0,250,20,4,procesos);
loop
if(key(_space))proceso(25,50,20,'n');procesos++;while(key(_space))frame;end end
if(key(_esc))exit();end
frame;
end
end

process proceso(int inst_bloq,int t_ej,t_bloq, char bloq)
private

begin
x=100;
y=200;
write_var(0,x,y-40,4,t_bloq);
write_var(0,x,y-20,4,t_ej);
write_var(0,x,y,4,inst_bloq);

while(escaneo=get_id(type proceso))//hace una búsqueda de todos los procesos
    if(escaneo.pos < id.pos)//y si alguno tiene una posición anterior a la suya (llegó antes)
        delante=escaneo; //se pone detrás de él
        escaneo.detras=id;end  //y le indica a ese proceso que está detras de el
end

    if(exists(delante)) x=delante.x; end //si tiene a alguien delante se pone a su altura, así no tenemos que andar
    if(exists(delante) and !exists(detras)) //si tiene a alguien delante y no tiene a nadie detras
         ultimo=id;         // guarda su id como la del último
    end

while(t_ej>0) //mientras le quede tiempo de ejecución estará haciendo todo esto

        if(!exists(delante)) // si no tiene a nadie delante
            ejec=1; //se pone en ejecución
        end

    while(ejec==1 and t_ej>0 and (inst_bloq>0 || bloq=='x')) //si tiene el derecho de ejecutarse y le queda tiempo de ejecucion
    //y (no se ha llegado al bloqueo o ya no tiene que bloquearse (bloq = x es bloqueo nulo))
        inst_bloq--;
        t_ej--;
        drawing_color(amarillo);
        draw_line(x,y,x,y+5);
        x++;
        frame;
     end

     if(inst_bloq<=0 and bloq!='x') //si su instante de bloqueo es menor que 0 y no tiene bloqueo nulo...
        bloq='s'; //... debe irse al bloqueo por lo que le ponemos en bloqueo
        if(exists(detras))detras.delante=0;end /*como deja de estar el primero para irse al bloqueo, si tiene alguien detrás
        le indica que ahora es el el primero diciendole que no tiene a nadie delante*/
        write(0,x,y-10,4,t_ej);
        end

    while(t_bloq>0 and bloq=='s') //si aun le queda tiempo de bloqueo y se encuentra en bloqueo...
        t_bloq--;   //va restandole tiempo de bloqueo
        drawing_color(rojo); //esto sirve como referencia para ver cuando está en bloq
        draw_line(x,y,x,y+5);//esto sirve como referencia para ver cuando está en bloq
        x++; //aunque esté en bloqueo debe seguir avanzando para coordinarse con los demás procesos
        frame;
    end

    if(t_bloq<=0 and bloq=='s')//si t_bloq<0 y bloq==s quiere decir que acaba de salir del bloqueo
        delante=ultimo; //por lo que se coloca el último (pone delante de el al último)
        ultimo=id; //y pone su id en donde se guarda la id del último
        bloq='x'; //ya no se puede bloquear más, por lo que pone el bloqueo en nulo
    end
frame;

end //while de ejec>0

end[/code]
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 14, 2008, 03:46:09 PM
este me funciona


declare process proceso(int inst_bloq,int t_ej,t_bloq,char bloq)
public
int pos1,ejec;
proceso delante;
proceso detras;
proceso escaneo;
end
end


process proceso(int inst_bloq,int t_ej,t_bloq,char bloq)
begin
    escaneo = 1234;
    escaneo.pos1 = 0;

end

begin
proceso(0,0,0,'a');
end

Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 14, 2008, 03:56:29 PM
""""" id.pos """"" !!!!!

por que "id." ?

directamente es "pos"... "id" no es de tipo "proceso", caramba!

Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 03:57:58 PM
oops! JA ja ja, Gracias Splinter!
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 09:50:01 PM
Splinter, hemos dicho que no se pueden poner como publicas variables que se pasen como parametro no? es decir, que toda variable que quiera poner publica y como parametro de un proceso debo duplicarla no?

jo jo jo, menudo coñazo! ja ja ja
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 14, 2008, 10:28:31 PM
si, asi es.
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 14, 2008, 11:35:57 PM
Splinter, mirate este código, y cuando digo mirate me refiero a que primero lo ejecutes y luego busques el problema si lo hay. Los controles son los siguientes, con la barra espaciadora creas unos cuantos procesos, (crea tres por ejemplo) y con el intro los arrancas. Verás que se va dibujando una gráfica, pues bien, una vez terminada, si pasas el ratón por encima de las líneas blancas verás que se ponen negras, se quedan negras un rato y a veces se vuelven blancas otra vez, otras no, vamos, un pifostio.

Compilado con la wip 15

Solo necesita un archivo llamado raton.png que es el raton que tienes tú en tu splinters gui. Muchas gracias

[code language="bennu"]//include"gui.inc"
#define ancho 640
#define alto 480
#define amarillo rgb(100,100,158)
#define rojo rgb(200,10,10)
#define BLANCO rgb(255,255,255)
#define MORADO rgb(200,50,200)
#define VERDIN rgb(10,200,100)
import "mod_mouse";
import "mod_rand";
import "mod_text";
import "mod_proc";
import "mod_grproc";
import "mod_map";
import "mod_draw";
import "mod_key";
import "mod_math";
import "mod_screen";
import "mod_video";

declare process proceso(int inst_bloq,int time_ej,int time_bloq,char bloq,int posicion)
public
int pos,ejec,t_ej,t_bloq;
proceso delante;
proceso detras;
proceso escaneo;
end
end

            local
                    int i;

            global
                    int procesos,empezar,inst_b,t_b,marca=0;
                    proceso ultimo;
                    int proporcion=2;

begin
set_mode(ANCHO,ALTO,16);
write(0,100,20,4,"Procesos creados:");
write_var(0,250,20,4,procesos);
mouse.graph=load_png("raton.png");
center_set (0,mouse.graph,0,0);

//DIBUJAMOS LA TABLA DE LOS PROCESOS
write(0,400,30,4,"T. EJ.");
write(0,475,30,4,"INST. BLOQ");
write(0,555,30,4,"T. BLOQ");

loop
    if(key(_space))
        inst_b=rand(0,50); if(inst_b>0)t_b=rand(10,60);else t_b=0;end
        ultimo=proceso(inst_b,rand(50,100),t_b,'n',procesos);procesos++;
        if(!get_id(type grafica))grafica();end
        while(key(_space))frame;end
        end
while(key(_enter))empezar=1;frame;end
empezar=0;
if(key(_esc))exit();end
frame;
end
end



/******************************************************************************************************************
*********************************PROCESO DEL PROCESO REDUDO*********************************************************
*******************************************************************************************************************/
process proceso(int inst_bloq,int time_ej,int time_bloq, char bloq,int posicion)
    private
    int textos[3];
    begin
        x=50;
        y=100+procesos*12;

        pos=posicion;
        t_ej=time_ej;
        t_bloq=time_bloq;
    /*----tabla de valores------------------------------------------------------------*/
        write(0,350,40+pos*10,4,pos);
        textos[0]=write_var(0,390,40+pos*10,4,t_ej); boton(1,410,40+pos*10);boton(2,420,40+pos*10);
        textos[1]=write(0,475,40+pos*10,4,inst_bloq);
        textos[2]=write_var(0,545,40+pos*10,4,t_bloq);            boton(3,560,40+pos*10);boton(4,570,40+pos*10);
    /*--------------------------------------------------------*/
while(empezar==0)
    while(escaneo=get_id(type proceso))//hace una búsqueda de todos los procesos
        if(escaneo.pos < pos)//y si alguno tiene una posición anterior a la suya (llegó antes)
            delante=escaneo; //se pone detrás de él
            escaneo.detras=id;end  //y le indica a ese proceso que está detras de el
    end

    if(exists(delante)) x=delante.x; end //si tiene a alguien delante se pone a su altura, así no tenemos que andar
frame;
end

/*if(exists(detras))write_var(0,x-90,y,4,detras.pos);end  Esto comentado era para escribir quien tiene delante y
if(exists(delante))write_var(0,x-80,y,4,delante.pos);end* quien tiene detras*/

delete_text(textos[0]); //borramos la variable que se actualiza para que no se vaya restando, sino que se pueda ver siempre
delete_text(textos[2]); //borramos la variable que se actualiza para que no se vaya restando, sino que se pueda ver siempre
textos[0]=write(0,390,40+pos*10,4,t_ej); // y la sustituimos por una que no varíe, para poder consultar al final
textos[2]=write(0,545,40+pos*10,4,t_bloq);// y la ponemos en no variable, vamos lo mismo

while(t_ej>0) //mientras le quede tiempo de ejecución estará haciendo todo esto

        if(!exists(delante)) // si no tiene a nadie delante
            ejec=1; //se pone en ejecución
        else
            ejec=0;
        end

    while(ejec==1 and t_ej>0 and (inst_bloq>0 || bloq=='x')) //si tiene el derecho de ejecutarse y le queda tiempo de ejecucion
    //y (no se ha llegado al bloqueo o ya no tiene que bloquearse (bloq = x es bloqueo nulo))

        inst_bloq--;
        t_ej--;
        drawing_color(amarillo);
      from i=1 to  proporcion; // por cada unidad dibuja y mueve proporcion
        draw_line(x,y,x,y+10);
        x++;
      end//from
       frame;
     end

     if(inst_bloq<=0 and bloq!='x') //si su instante de bloqueo es menor que 0 y no tiene bloqueo nulo...
        bloq='s'; //... debe irse al bloqueo por lo que le ponemos en bloqueo
        if(exists(detras))detras.delante=0;end /*como deja de estar el primero para irse al bloqueo, si tiene alguien detrás
        le indica que ahora es el el primero diciendole que no tiene a nadie delante*/
        marca=1; //avisa de que se ponga una marca

        end

    while(t_bloq>0 and bloq=='s') //si aun le queda tiempo de bloqueo y se encuentra en bloqueo...
        t_bloq--;   //va restandole tiempo de bloqueo
        drawing_color(rojo); //esto sirve como referencia para ver cuando está en bloq
        from i=1 to  proporcion;
             draw_line(x,y,x,y+5);//esto sirve como referencia para ver cuando está en bloq
             x++; //aunque esté en bloqueo debe seguir avanzando para coordinarse con los demás procesos
        end//from
        frame;
    end

    if(t_bloq<=0 and bloq=='s')//si t_bloq<0 y bloq==s quiere decir que acaba de salir del bloqueo
       if(exists(ultimo)) //si el fuera el ultimo, ya no habría ningun último posible, por eso es necesario esto
           delante=ultimo; //por lo que se coloca el último (pone delante de el al último)
           ultimo=id; //y pone su id en donde se guarda la id del último
           delante.detras=id;
        end
        bloq='x'; //ya no se puede bloquear más, por lo que pone el bloqueo en nulo
        marca=1; //avisa de que se ponga una marca // Aquí dibujamos en el momento en el que sale del bloqueo el tiempo de ej que queda

    end
frame;
    from i=1 to  proporcion;
        x++;
    end //from

end //while de ejec>0
marca=1; //avisa de que se ponga una marca



end

/*********************************GRAFICA BLANCA QUE LO MARCA TODO****************/
process grafica()

            private
                int instante;

            begin
                x=50;

    while(empezar==0)
        y=ultimo.y+12;
        frame;
    end

            drawing_color(BLANCO);
            draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo


    while(get_id(type proceso))

            if(marca!=0)
                write(0,x,90,4,instante); // Aquí dibujamos en el momento en el que termina de ejecutarse y el tiempo de ej que queda
                drawing_color(BLANCO);
                draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo
                marca=0;
            end

        instante++;

    from i=1 to proporcion;         // por cada unidad de tiempo lo mueve proporcion veces
        put_pixel(x,y,blanco); // por cada unidad de tiempo lo dibuja proporcion veces
         x++;
     end

        frame;
    end // bucle madre

    if(marca!=0)
            write(0,x,90,4,instante); // Aquí dibujamos en el momento en el que termina de ejecutarse y el tiempo de ej que queda
            drawing_color(BLANCO);
            draw_line(x,y,x,95);// y dibuja una línea blanca desde su posicion hasta arriba para marcarlo
            marca=0;
        end

  end


  process boton(int tipo,int x,int y)
  private
  int mapa;
  proceso padre;
  begin
  graph=new_map(10,10,16);

  padre=father;
  switch(tipo)
    case 1:
        map_clear(0,graph,VERDIN);
        mapa=write_in_map(0,"+",4);
        map_put(0,graph,mapa,5,5);
        loop
            if(collision(type mouse) && mouse.left && exists(padre))
               padre.t_ej++;
              end//if
              frame;
          end//loop
        end

   case 2:
        map_clear(0,graph,MORADO);
        mapa=write_in_map(0,"-",4);
        map_put(0,graph,mapa,5,5);
        loop
            if(collision(type mouse) && mouse.left && exists(padre))
                padre.t_ej--;
            end//if
            frame;
           end//loop

    end

    case 3:
        map_clear(0,graph,VERDIN);
        mapa=write_in_map(0,"+",4);
        map_put(0,graph,mapa,5,5);
        loop
            if(collision(type mouse) && mouse.left && exists(padre))
                padre.t_bloq++;
            end//if
            frame;
           end//loop

    end

    case 4:
        map_clear(0,graph,MORADO);
        mapa=write_in_map(0,"-",4);
        map_put(0,graph,mapa,5,5);
        loop
            if(collision(type mouse) && mouse.left && exists(padre))
                padre.t_bloq--;
            end//if
            frame;
           end//loop

    end
  end //switch



  end //begin

[/code]
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 15, 2008, 07:04:37 AM
ahora no tengo la gui, porque la perdi, tengo que buscarla y armar mi entorno...
pero te comento, algo que ya se comento y creo que fue a vos...

cuando en un loop usas get_id, collision, o cualquier funcion que recorre la lista de procesos y los retorna 1 a 1, no se puede usar frame, si usas frame, reseteas el ciclo y empieza a retornar nuevamente el primero que encuentra... y nunca va a los demas...

bueno, revisa eso, si eso no es tu problema, avisame y me armo todo el entorno de pruebas, pero aun no tengo todo mi entorno de pruebas, desarrollo y resources al 100%...
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 15, 2008, 08:43:30 AM
Ja ja ja, splinter, deberías dormir un poco, mi problema no tiene nada que ver con lo que comentas. Es un problema con el dibujado de las primitivas, que una vez dibujadas, al pasar el raton por encima se ponen negras, se quedan un rato, parpadean etc, no tiene nada que ver con encontrar los procesos, eso ya lo aprendí en su día en este foro y me ha sido realmente muy util, pero ese no es ahora el problema.

Splinter, no hace falta tu gui, solo una imagen con un puntero de raton llamada raton.png, por ejemplo el que venía en tu gui.

Un saludo.
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 15, 2008, 08:54:51 AM
lo que me refiero con eso, es que quizas pensabas que cambiaba el color o algo y en realidad no lo hacia...
bueno, lo vere luego, ahora me voy a dormir un rato, que son las 6:50AM y ya esta sonando el despertador... maldicion... me voy a dormir igual...
Title: Re: Problema accediendo a variables locales
Post by: Danielo515 on December 15, 2008, 02:56:47 PM
Por cierto splinter, no soy capaz de borrar las primitivas gráficas (me refiero a todas). He probado con clear_screen, con delete_draw(0), con map_clear(0,0,0) y naranjas de la china. ¿como demonios me desago de ellas?

Muchas gracias
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 15, 2008, 03:41:15 PM
ya veo...
por ahora agrega en el main...


dump_type = 1;
restore_type = 1;


gracias
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 15, 2008, 04:16:42 PM
la funcionalidad de borrar todos los objetos primitivas, por ahora esta deshabilitada...
necesito completar el modulo...
Title: Re: Problema accediendo a variables locales
Post by: SplinterGU on December 27, 2008, 02:36:54 AM
Corregido el problema que hacia que en una sentencia de declaracion de multiples variables tipo proceso, solo la primera era de tipo proceso.