• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

x3minater

"PRESS ANY KEY TO CONTINUE" - curses.h

12 mensagens neste tópico

Boas

Estou com um problema num projecto...

É o seguinte, de entre muitas outras coisas que é preciso fazer, precisamos de ter uma função do estilo

"Prima qualquer tecla para continuar"

e guardar essa tecla...

Tive a procurar umas coisas na biblioteca do curses e encontrei a função getch(); que parece que server para isso...

Ora eu fiz um pequeno programa de teste que se segue.

A minha questão era se há alguma maneira de eu usar a função carrega_tecla(); no meio de código dito "normal" que não seja curses related?

É que o programa acaba quando sai da função e nem imprime o a variavel aux antes da função  :wallbash:

#include <curses.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

void carrega_tecla(void){
int ch;
int row, col;
char str[50];

initscr();
raw();
keypad(stdscr,TRUE);
noecho();

strcpy(str,"<Prima qualquer tecla>");

getmaxyx(stdscr,row,col);
mvprintw(row/2,(col-strlen(str))/2,"%s\n",str);
ch = getch();

system("clear");

printw("A tecla premida foi %c",ch);


refresh();
getch();

endwin();

}

int main (void){
int aux=1337;

printf("%d",aux);

carrega_tecla();





return 0;}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Edit: mandei um bitaite sem ler bem o teu código

O que te está a faltar é chamares a função nodelay().

Vê qual é o retorno da função initscr() e guarda-o numa variável, por exemplo "scr".

Depois fazes: nodelay(scr,FALSE)

Só quando fazes isto é que o programa espera que pressiones uma tecla.

E com isto acho que já vez a coisa a funcionar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Edit: mandei um bitaite sem ler bem o teu código

O que te está a faltar é chamares a função nodelay().

Vê qual é o retorno da função initscr() e guarda-o numa variável, por exemplo "scr".

Depois fazes: nodelay(scr,FALSE)

Só quando fazes isto é que o programa espera que pressiones uma tecla.

E com isto acho que já vez a coisa a funcionar :)

OK, obrigado por avisares, mas o meu problema não era esse...

Queria saber como posso implementar a minha função carrega_tecla() no meio de código normal...

É que nem consigo fazer o printf antes da chamada da função e quando acaba a função termina o programa =\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que eu penso que está a acontecer é que o programa abre logo a janela do curses. Ou seja, nem chegas a ver o printf inicial.

Experimenta fazer isto:

Põe um "while(getchar() != '\n'); depois desse printf, fazendo com que a função "initscr()" só seja chamada depois de pressionares ENTER.

E lembra-te disto: não podes fazer printfs a meio do ambiente curses. Se quiseres imprimir strings no curses tens que utilizar funções próprias como a "addstr()".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que eu penso que está a acontecer é que o programa abre logo a janela do curses. Ou seja, nem chegas a ver o printf inicial.

Experimenta fazer isto:

Põe um "while(getchar() != '\n'); depois desse printf, fazendo com que a função "initscr()" só seja chamada depois de pressionares ENTER.

E lembra-te disto: não podes fazer printfs a meio do ambiente curses. Se quiseres imprimir strings no curses tens que utilizar funções próprias como a "addstr()".

Pois assim funciona, mas não era bem essa a funcionalidade que pretendia...

Queria simplesmente que a meio de um programa (não é apenas o código que pus acima) fosse pedido para carregar em qualquer tecla para continuar e depois continuar com o programa normalmente... implementar as funcionalidades do curses só numa função à parte do código normal...

Se der para fazer isso sem usar o curses é que era excelente, porque parece que essa biblioteca é tipo uma linguagem de programação à parte :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloca char como variável global...

char tecla;

void carrega_tecla()
{
printf("Pressione a Tecla! ");
tecla=getche();
main();
}

É aparentemente SIMPLES!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloca char como variável global...

char tecla;

void carrega_tecla()
{
printf("Pressione a Tecla! ");
tecla=getche();
main();
}

É aparentemente SIMPLES!

E como é que é eu uso funções do conio.h no unix? =\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não usas porque a conio é exclusiva dos compiladores da Borland. A não ser que arranjes os ficheiros da biblioteca (o .a ou .so) e os linkes no teu projecto, mas mesmo assim não te posso garantir que vá funcionar. Tens uma biblioteca semelhante em *nix que oferece os mesmos tipos de serviços: ncurses.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não usas porque a conio é exclusiva dos compiladores da Borland. A não ser que arranjes os ficheiros da biblioteca (o .a ou .so) e os linkes no teu projecto, mas mesmo assim não te posso garantir que vá funcionar. Tens uma biblioteca semelhante em *nix que oferece os mesmos tipos de serviços: ncurses.

pois era com essa que estava a trabalhar... mas queria ver se arranjava uma alternativa para nao tornar o código tão complicado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloca char como variável global...

char tecla;

void carrega_tecla()
{
printf("Pressione a Tecla! ");
tecla=getche();
main();
}

É aparentemente SIMPLES!

getche() não é standard. Chamar a função main() é ALTAMENTE desaconselhado, nem consigo entender porque é que a chamas neste caso.

Porque a solução é tão simples, e para tentar corrigir a resposta anterior, vou meter aqui código e explicar o pouco que existe para explicar :)

void pressionar_tecla() {
puts("Pressione qualquer tecla para continuar. . .");
getc(stdin);
}

A função getc() recebe um FILE*, de onde extrai um caracter. Ao ser passado stdin, e porque este não é mais que um apontador para ficheiro, vai extrair um caracter do standard input.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

getche() não é standard. Chamar a função main() é ALTAMENTE desaconselhado, nem consigo entender porque é que a chamas neste caso.

Porque a solução é tão simples, e para tentar corrigir a resposta anterior, vou meter aqui código e explicar o pouco que existe para explicar :)

void pressionar_tecla() {
puts("Pressione qualquer tecla para continuar. . .");
getc(stdin);
}

A função getc() recebe um FILE*, de onde extrai um caracter. Ao ser passado stdin, e porque este não é mais que um apontador para ficheiro, vai extrair um caracter do standard input.

Pois, também já tinha experimentado isso :)

Mas nesse caso é preciso carregar enter depois de premir qualquer tecla... Eu quero é que ele continue logo que se carrega qualquer tecla... SEM ENTER!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, escapou-me esse pormenor.

Assim sendo, parece-me que tens que recorrer a bibliotecas para fazer o que queres, sejam elas ncurses, win32, ou possivelmente linux.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora