Olá pessoal! Tive o objetivo de elaborar esse artigo para facilitar a vida daqueles que estão programando e não sabem como portar as funções da conio.h para o Linux.
A função kbhit() no Linux. Para substituí-la não precisaremos executar nenhum teste com if, como no caso:
if ( kbhit() )
{
tecla = getch();
Esse é o método comum usando na conio.h. Na verdade não encontrei nenhuma função exatamente igual a kbhit, mas se você colocar a função timeout(0) no início do bloco, garantirá a execução do bloco independente da entrada do teclado.
Ficará assim:
int main()
{
char tecla;
initscr();
clear();
timeout(0); //a função já garante a execução do bloco com ou sem entrada de teclado;
keypad(stdscr, TRUE);
noecho();
Concluindo, é fácil converter aplicações originalmente programadas em Windows para funcionarem no Linux substituindo a conio.h pela ncurses.h.
Espero ter ajudado com este artigo. Ainda pretendo pôr bem mais.
[1] Comentário enviado por GuilhermeAugusto em 08/07/2008 - 21:42h
Bem interessante. Todo mundo que coda C já sofreu com a conio.h. Extremamente comum achar exemplos em livros contendo getch() ou mesmo system("PAUSE">>NULL); bastante difíceis pra portar pro Linux.
[3] Comentário enviado por removido em 09/07/2008 - 07:09h
Para deixar os programas ainda mais portáveis, experimente uma biblioteca que segue o padrão Curses para Windows, a PDCurses (http://pdcurses.sourceforge.net/), eu a usei para definitivamente substituir <conio.h> nos meus projetos da universidade. Eu até escrevi uma biblioteca de componentes (checkboxes, radiobuttons, edit etc) em cima dela (envio sob demanda). Abraços.
[5] Comentário enviado por edimartin em 18/12/2008 - 23:58h
Olá. Eu fiz testes aqui usando a ncurses e eu gostaria de saber.
Porque quando eu uso o scanw (scanf da stdio em ncurses) e clico enter ele também printa na tela o enter?
E quando eu uso a getch se eu clico uma letra ele não faz nada, mas quando eu clico enter ele printa na tela o enter.
O que a nCurses tem que ela ama o enter?
Para retirar o enter do getch a solução é antes usar a funcao noecho que mesmo assim ele não printa o enter.
[6] Comentário enviado por erissonsilva em 23/12/2008 - 09:10h
Deixa eu ver se entendi, vc quer que o scanw() atribua um valor a uma variável sem a necessidade de enter. Acho que não funciona assim, mas eu imagino o porquê.
O meu código acima se vc reparou tem alguns erros, eu vou corrigir e repostar o código.
Repare que a função getch() não distingue a natureza da variável pois só tem a função de ler variáveis 'char', scanw() assim como scanf() captura variáreis de diversas naturezas, por isso ela necessita do enter.
Se vc quiser coloque após o initscr() a função raw(), pois esta captura os dados do teclado sem fazer distinção das teclas de controle do shell com CTRL+C ou CTRL+Z. Apenas lê os dados int de cada tecla ou combinação de teclas pressionadas, mas lembre-se de atribuir uma tecla para finalizar o programa se não terá de fechar o terminal. Ex.:
int quit;
quit = 27; // valor da tecla esc
// inclua mais um else if no código
else if (tecla == quit)
exit(0);
Assim vc terá controle total sobre a execução do seu código.
Qualquer dúvida respondo assim que puder. Um abraço e viva o Linux!!