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]
+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
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'...
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.
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...
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.
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
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]
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
""""" id.pos """"" !!!!!
por que "id." ?
directamente es "pos"... "id" no es de tipo "proceso", caramba!
oops! JA ja ja, Gracias Splinter!
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
si, asi es.
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]
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%...
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.
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...
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
ya veo...
por ahora agrega en el main...
dump_type = 1;
restore_type = 1;
gracias
la funcionalidad de borrar todos los objetos primitivas, por ahora esta deshabilitada...
necesito completar el modulo...
Corregido el problema que hacia que en una sentencia de declaracion de multiples variables tipo proceso, solo la primera era de tipo proceso.