[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Muitas perguntas!



Marcos Lemos writes:
 > Yoshi,
 > 
 > Sobre a seguinte passagem, gostaria de saber se minhas interpretações
 > estão corretas:
 > 
 >     int k;
 >     comeco = fim = NULL;
 >     for (k = 1; k <= n; k++)
 >       if (el (k)->g_entr == 0)
 > 	if (comeco == NULL)
 > 	  fim = comeco = el (k);
 > 	else
 > 	  {
 > 	    fim->prox_fila = el (k);
 > 	    fim = el (k);
 > 	  }
 >   }

Tenho a impressão de que você está tentando ler o codigo sem olhar a
documentacao que vem nas versões completas... como o ex11.dvi, ex11.ps,
ex11.pdf (ou mesmo o ex11.w).  Está dito, na seção 12, que comeco e fim
correspondem a uma fila que guardará as fontes em cada instante.  O codigo
acima simplesmente insere el(k) nesta fila, caso g_entr se tornou 0.

 > 	Nessa parte, COMECO e FIM comecam como NULL e o programa analisa o
 > g_entr de cada um dos dados contidos em ELS. Se o no inicio da analise o
 > COMECO estiver vazio, entao a tarefa e inserida tanto em FIM como em
 > COMECO, senao o elemento analisado sera colocado no PROX_FILA do
 > elemento que se encontra em fim (ou seja, seja será um sucessor do
 > elemento ue já consta em FIM (???) ). Logo em seguida, esta tarefa e
 > inserida dentro de FIM.
 > 	Digamos que eu tenha a seguinte entrada:
 > 	5
 > 	1 2
 > 	1 3
 > 	2 3
 > 	3 4
 > 	5 4
 > 	Podemos perceber que 1 e 5 possuem g_entr=0... Já posso interpretar
 > nesta parte do programa que já temos duas rodadas em execução (uma
 > máquian executa 1, e outra , executa 5)

Não... estamos chamando de rodada a execução simultânea de tarefas.  As
tarefas 1 e 5 podem ser executadas em uma mesma rodada (na primeira rodada).  

 > 	Então, inicialmente, a tarefa 1 seria incluída em COMECO e tambem em
 > FIM ? Já a tarefa 5 (cujo g_entr=0) seria colocada como sucessora de 1
 > dentro da estrutura FIM ? 

Aqui voce precisa recapitular como implementamos filas usando listas ligadas,
como visto nas aulas de 1/9 e 3/9.

 > 	Seguindo com o mesmo exemplo   
 >   while (comeco)
 >     {
 >       struct sucessor *ptr, *tmp;
 >       ptr = comeco->topo_suc; 
 > 
 > PTR estaria apontando para a lista de sucessores da tarefa que se
 > encontra em COMECO (logo estaria apontando para 2, que estaria apontando
 > para 3 (???)). É isso ?	
 > 
 >       while (ptr)
 > 	{
 > 	  ptr->id->g_entr--;
 > 	  if (ptr->id->g_entr == 0)
 > 	    {
 > 	      ptr->id->prox_fila = NULL;
 > 	      fim->prox_fila = ptr->id;
 > 	      fim = ptr->id;
 > 	    }
 > 	
 > 
 > 	  tmp = ptr;
 > 	  ptr = ptr->prox_suc;
 > 	  free (tmp);
 > 	}
 > 
 > Bem, gostaria de saber se, pelos menos, estou no caminho certo... Na
 > verdade, presumo que, no EP, basta incrementar este programa para que
 > ele faça a contagem de rodadas, 

O ex11 não faz, por si só, a decomposição das tarefas em rodadas
concretamente, embora esteja muito próximo de fazê-lo.

 > portanto o seu completo entedimento é
 > fundamental, não e verdade ?

É.  Boa sorte, Yoshi

 > Lemos