Sleep em C - Linux [RESOLVIDO]

1. Sleep em C - Linux [RESOLVIDO]

mateus da silva
metalicarus1

(usa Ubuntu)

Enviado em 04/09/2017 - 13:46h

Olá, estou com o seguinte problema: Quando executo o meu código, a função sleep() "pula" o printf() que antecede ela e passa para o próximo.


#include<stdio.h>
#include<stdlib.h>

void gotoxy(int x,int y){
printf("%c[%d;%df",0x1B,y,x);

}

main(){
int dia;
int erro=1;

printf("Informe um dia: ");
scanf("%d", &dia); // LEITURA DOS DADOS

while(erro!=0){ // LAÇO WHILE
if(dia<0 || dia>31){
gotoxy(20,0);
printf(" Dia invalido!"); // A FUNÇÃO SLEEP ESTÁ PULANDO ESSE PRINTF("DIA INVALIDO");
sleep(5); // AGUARDA OS 5 SEGUNDOS.
gotoxy(16,0);
printf(" "); // E IMPRIME SOMENTE OS ESPAÇOS, E SEGUE O PROGRAMA NORMALMENTE.

gotoxy(0,0);
printf("Informe um dia: ");
scanf("%d", &dia);

}
else{
gotoxy(16,0);
printf(" Dia valido!");
erro--;
}

}




}


Alguém faz ideia de como solucionar ?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/09/2017 - 02:07h

Ao final da string que antecede a pausa, coloque uma quebra de linha ("\n"). Alternativamente, chame fflush(stdout) após a impressão e antes da pausa.

3. Re: Sleep em C - Linux [RESOLVIDO]

Gabriel Monteiro
Sharggothon

(usa Debian)

Enviado em 04/09/2017 - 13:58h

Qual compilador está usando? Testei no Tiny C Compiler (para Windows) e funcionou.


4. Re: Sleep em C - Linux [RESOLVIDO]

Paulo Vianna
quartodazona

(usa Debian)

Enviado em 04/09/2017 - 14:02h

Sharggothon escreveu:

Qual compilador está usando? Testei no Tiny C Compiler (para Windows) e funcionou.


Na verdade o erro está na linha abaixo (eu acho).

sleep(5);


No Linux para dar 5 segundos você tem que colocar um valor maior, algo como 5000.

Acredito que seja isso porque há uns 10 anos atrás tive de fazer um trabalho em C multiplataforma e sofri com um problema assm.


5. Re: Sleep em C - Linux [RESOLVIDO]

mateus da silva
metalicarus1

(usa Ubuntu)

Enviado em 04/09/2017 - 14:03h

Estou usando o GCC.


6. Re: Sleep em C - Linux [RESOLVIDO]

Gabriel Monteiro
Sharggothon

(usa Debian)

Enviado em 04/09/2017 - 14:04h

quartodazona escreveu:

Sharggothon escreveu:

Qual compilador está usando? Testei no Tiny C Compiler (para Windows) e funcionou.


Na verdade o erro está na linha abaixo (eu acho).

sleep(5);


No Linux para dar 5 segundos você tem que colocar um valor maior, algo como 5000.

Acredito que seja isso porque há uns 10 anos atrás tive de fazer um trabalho em C multiplataforma e sofri com um problema assm.

No Windows, para esperar 5 segundos precisa também ser algo em torno de 5000. Mas mesmo se fosse isso, não deveria dar erro, apenas não iria esperar.




7. Re: Sleep em C - Linux [RESOLVIDO]

mateus da silva
metalicarus1

(usa Ubuntu)

Enviado em 04/09/2017 - 14:06h

Sharggothon escreveu:

quartodazona escreveu:

Sharggothon escreveu:

Qual compilador está usando? Testei no Tiny C Compiler (para Windows) e funcionou.


Na verdade o erro está na linha abaixo (eu acho).

sleep(5);


No Linux para dar 5 segundos você tem que colocar um valor maior, algo como 5000.

Acredito que seja isso porque há uns 10 anos atrás tive de fazer um trabalho em C multiplataforma e sofri com um problema assm.

No Windows, para esperar 5 segundos precisa também ser algo em torno de 5000. Mas mesmo se fosse isso, não deveria dar erro, apenas não iria esperar.



Mudei de 5 para 5000 e o erro persiste.


8. Re: Sleep em C - Linux [RESOLVIDO]

Gabriel Monteiro
Sharggothon

(usa Debian)

Enviado em 04/09/2017 - 14:14h

tenta dar um
#include <unistd.h> 
como dito em: https://www.vivaolinux.com.br/topico/C-C++/Sleep()-no-gcc


9. Re: Sleep em C - Linux [RESOLVIDO]

mateus da silva
metalicarus1

(usa Ubuntu)

Enviado em 04/09/2017 - 14:16h

Sharggothon escreveu:

tenta dar um
#include <unistd.h> 
como dito em: https://www.vivaolinux.com.br/topico/C-C++/Sleep()-no-gcc


Mudei a biblioteca e o erro persistiu.


10. Re: Sleep em C - Linux

Paulo Vianna
quartodazona

(usa Debian)

Enviado em 04/09/2017 - 15:51h

metalicarus1 escreveu:
Mudei de 5 para 5000 e o erro persiste.


Meu caro, então o seu erro pode estar na forma como está sendo lida essa variável dia. Pode ser que o Windows leia de forma diferente da que é lida no Linux.

Faça o teste dos breakpoints exibindo o que está dentro dessa variável dia. O seu problema provavelmente não é no Sleep e sim em sua condicional.

Se você diz isso: // A FUNÇÃO SLEEP ESTÁ PULANDO ESSE PRINTF("DIA INVALIDO"); quer dizer que outra coisa que está provavelmente causando isso e não o sleep.





11. Re: Sleep em C - Linux [RESOLVIDO]

mateus da silva
metalicarus1

(usa Ubuntu)

Enviado em 05/09/2017 - 10:09h

paulo1205 escreveu:

Ao final da string que antecede a pausa, coloque uma quebra de linha ("\n"). Alternativamente, chame fflush(stdout) após a impressão e antes da pausa.


Caraaaamba. Deu certo!! Quem diria que seria algo tão simples, já estava achando que era algum erro do compilador. Agradeço a sua ajuda e a de todos quem se empenharam. Abraços.


12. Re: Sleep em C - Linux [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/09/2017 - 13:40h

Eu estava no celular, por isso não escrevi muito, e não expliquei o problema. Agora que estou no micro, deixe-me explicar.

A saída padrão, que é o destino de operações como printf(), putchar() e puts() utiliza um buffer de saída, que pode acumular o resultado de múltiplas operações de escrita antes de encaminhar tudo o que foi acumulado para a saída real, no dispositivo que estiver associado à saída padrão.

O motivo disso é que escrever na saída final geralmente é uma operação computacionalmente mais cara, pois costuma envolver chamadas ao sistema operacional e operações sobre dispositivos significativamente mais lentos do que a memória (como o console, um emulador de terminal, um canal de comunicação via rede ou mesmo em disco). Além do mais, alguns desses dispositivos são naturalmente orientados a escrever dados em blocos (principalmente disco ou operações que envolvam comunicação de rede), em vez de poucos caracteres ou bytes de cada vez, e os ganhos de usar buffers com tais dispositivos são ainda mais expressivos.

Há três modos de seleção de buffers que podem ser associados a um stream de saída em C ou C++: buffer pleno, buffer orientado a linha ou sem buffer. O buffer pleno acumula dados até ficar completamente cheio, e descarrega os dados no destino final(*) apenas quando isso acontece. O buffer orientado a linha descarrega os dados toda vez que detecta uma quebra de linha ou quando o ambiente de execução detecta uma operação de leitura no terminal; contudo, se a linha for muito longa, ele se comporta como um buffer pleno. Já o modo sem buffer faz com que todas as operações resultem em escrita direta no destino.

Tipicamente, quando um programa em C ou C++ inicia, a saída padrão é programada para operar com buffer orientado a linha, e a saída de erros é programada para operar sem buffer. Você pode alterar esses modos de operação por meio da função setvbuf(), desde que essa seja a primeira operação feita sobre eles depois que o programa começa a executar, mas eu não recomendo que o faça. Em vez disso, cuide de colocar eventuais quebras de linha ao final de cada escrita, a menos que quebrar a linha atrapalhe a formatação. Em qualquer caso, você pode chamar fflush() para descarregar imediatamente o buffer que estiver associado ao stream.

----------------
(*) Na verdade, o destino final aqui descrito é do ponto de vista do programa em C. Depois que o sistema operacional é acionado para realizar a escrita, pode ser que ele, por sua própria conta, ainda retenha os dados em outro nível de buffer, sob seu próprio controle, mesmo após ter sinalizado ao programa que o chamou que os dados tinham sido escritos com sucesso.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts