Logo Hardware.com.br
David_wm18
David_wm18 Membro Senior Registrado
408 Mensagens 1 Curtida

[Resolvido] Dúvida programa C

#1 Por David_wm18 11/10/2007 - 20:42
Estou com uma dúvida em um programa em C q eu fiz:
cria_copia();
printf("\nQUICk SORT\n");
printf("TEMPO TESTADO: 0 segs\n");
printf("TEMPO GASTO: ");
t0=clock();
qsort(copia,max,sizeof(int),comp); // metodo de ordenação quick sort
tf=clock();
tquick=(tf-t0)/CLOCKS_PER_SEC;
printf("%u segs\n\n",tquick);
Esse eh so um trecho do algoritmo. A minha dúvida é q a saida desse trecho, apos compilado, eh essa:
QUICK SORT
TEMPO TESTADO: 0 segs
em vez de mostrar "TEMPO GASTO: "aqui, o programa 'pula' pro comando seguinte sem imprimir na tela. Só depois q ele chamar a função qsort() eh que ele vai imprimir na tela "TEMPO GASTO: ".
Alguém sabe por que? Eu sempre pensei q um algoritmo executava os comandos de cima pra baixo, a nao ser q tivesse um goto ou outro tipo de direcionador.cadeado_alegrinho.gif
pflynn
pflynn Ubbergeek Registrado
5.5K Mensagens 122 Curtidas
#4 Por pflynn
11/10/2007 - 23:27
David_wm18 disse:
pflynn, deu certo! Mas pq? Naum entendi pq deu certo desse jeito e nao do outro (jeito classico de fazer)!
rindo_ate_agora.png Explica-ê


Então, conforme combinado, vamos entender o que aconteceu. Quando você usa printf num programa C para escrever dados na saída padrão, os dados são enviados para uma área de buffer ao invés de serem enviados diretamente para a saída padrão. Cada vez que você chama printf, esse processo se repete. Quando esse buffer finalmente fica cheio, então essa área de buffer é esvaziada e os dados finalmente são enviados para a saída padrão. Esse procedimento (encher um buffer e depois, descarregar tudo de uma vez) ocorre por motivos de desempenho: escrever dados em um dispositivo (que pode ser um arquivo em disco, a tela do seu computador ou qualquer outro) é um processo custoso. Para diminuir esse custo, utiliza-se esse buffer: juntamos o máximo possivel de dados e então aproveitamos para escrever tudo de uma vez só quando o buffer fica cheio. É isso que aconteceu no seu programa: você chamou printf sucessivas vezes, e os dados foram acumulando no buffer. Como o buffer não se encheu até o momento da chamada a função qsort, nada foi enviado para a saida de dados. Quando a função qsort terminou de ser executada e o programa começou a ser encerrado, o próprio programa se encarregou de esvaziar os buffers de saída e escrever os dados na saída padrão. Não era o que você esperava. As vezes, queremos que tudo o que escrevemos seja enviado diretamente para a saída de dados. Queremos ignorar o uso do buffer. Foi o que aconteceu quando você usou fprintf em stderr: stderr é a saída de erros. A saída de erros normalmente é exatamente igual a saída padrão (stdout), mas com uma diferença: por padrão, a saída de erros não é bufferizada (não utiliza buffers). Logo, tudo o que você escreve na saída de erros é enviado diretamente para o destino final, sem passar por algum buffer. Por tanto, quando você quer que os dados do seu programa sejam enviados diretamente para o seu destino, opte por escreve-los na saída de erros. Mas existe ainda outra forma de resolver esse problema: chamar a função fflush. A função fflush faz com que os buffers do seu programa sejam imediatamente esvaziados e que os dados sejam enviados ao destino:

printf("\nQUICk SORT\n");
printf("TEMPO TESTADO: 0 segs\n");
printf("TEMPO GASTO: ");

fflush(stdout); /*força o esvaziamento dos buffers*/


Bom, resumidamente, é isso. Acho que agora você já tem um ponto de partida pra estudar essa questão e entender melhor o que aconteceu rindo_ate_agora.png
------------------------------------------------
Muito bom. Mas tijolo não revida!
------------------------------------------------
gsanchez
gsanchez Super Participante Registrado
473 Mensagens 4 Curtidas
#5 Por gsanchez
12/10/2007 - 00:13
pflynn, gostei muito dessa sua aula, bem didática. Não programo em C, mas consegui entender tudo!
"Porque ainda que a figueira não floresça, nem haja fruto na vide; ainda que decepcione o produto da oliveira, e os campos não produzam mantimento; ainda que as ovelhas da malhada sejam arrebatadas, e nos currais não haja gado; Todavia eu me alegrarei no SENHOR; exultarei no Deus da minha salvação."
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#8 Por tpcvasco
12/10/2007 - 19:02
Eu aprendi q o '\n' no printf sempre esvazia o buffer tb, assim
printf("TEMPO GASTO: \n");
Apareceria na tela antes de executar o qsort(), porém pularia uma linha a mais.
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal