Buenas!
Cómo va?
Hay dos cosas que me hacen ruido de la solución que implementé y que me gustaría preguntar.
Primero pregunto si es posible acceder a cada gusto disponible.
Implementé un array gustos de 20 elementos del task
type GUSTO, donde en cada uno asigno un numero que lo identifica y el
gusto asociado en el programa principal. El tema es que acá asumí que en g tengo todos los gustos, y no se si puedo.
--PROGRAMA PRINCIPAL
gustos: array(20) of GUSTO;
...
i: integer;
g: array(20) of gusto --MINUSCULA PUES SON TODOS LOS GUSTOS, NO LAS TASKS
begin
for i:=0 to 19 do
gustos[i].ASIGNAR(i,g[i]);
end for;
...
end;
La otra pregunta es sobre el armado de helados.
Implementé un task auxiliar llamado HELADERIA que actua como administador que asigna clientes a vendedores:
task body HELADERIA is
begin
loop
select
accept pedir_vendedor(v_asignado: out integer) do
accept pedir_cliente(idV: in integer);
v_asignado := idV;
end pedir_vendedor;
end select;
end loop;
end HELADERIA;
En el momento de que se asigna un cliente a un vendedor, este inicializa una cola de 0 a 19, y va viendo de que gusto es el helado con indice frente de la cola con el objetivo de identificar el TASK asociado al gusto pedido. Separo en dos casos:
- Si alguien ya esta utilizando ese gusto, no se podra fijar de que gusto es, por lo que desencola y encola nuevamente ese numero para chequearlo luego.
- Si no están utilizando ese gusto, entonces se fija si es el gusto buscado y, en caso de serlo, devuelve true y termina la iteración, poniendose a armar el helado.
task body VENDEDOR is
mi_id,i: integer;
C: Cola;
begin
...--asignacion de id y pedido de cliente
accept PEDIR(g: in gusto) do
inicializar_cola(C,20);
encontre:=false;
while not encontre do
frente(C,i);
select
gustos[i].obtener_helado(g,encontre);
desencolar(i);
else:
desencolar(i);
encolar(i);
end select;
end while;
entregar_o_recibir_helado();
end PEDIR;
...
end VENDEDOR;
Saludos,
Joel