Problema accediendo a variables locales

Started by Danielo515, December 14, 2008, 01:42:24 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

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]


panreyes

+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

SplinterGU

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'...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

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.

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

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.

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

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]

SplinterGU

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

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

SplinterGU

#9
""""" id.pos """"" !!!!!

por que "id." ?

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

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

Danielo515


Danielo515

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

SplinterGU

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

Danielo515

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]

SplinterGU

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%...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2