Jump to content
Sign in to follow this  
x3minater

"PRESS ANY KEY TO CONTINUE" - curses.h

Recommended Posts

x3minater

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;}

Share this post


Link to post
Share on other sites
msr

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 :)

Share this post


Link to post
Share on other sites
x3minater

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 =\

Share this post


Link to post
Share on other sites
msr

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()".

Share this post


Link to post
Share on other sites
x3minater

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 :)

Share this post


Link to post
Share on other sites
iCl4w

Coloca char como variável global...

char tecla;

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

É aparentemente SIMPLES!


EOF!

Share this post


Link to post
Share on other sites
x3minater

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? =\

Share this post


Link to post
Share on other sites
Baderous

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.

Share this post


Link to post
Share on other sites
x3minater

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...

Share this post


Link to post
Share on other sites
TheDark

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.


Desaparecido.

Share this post


Link to post
Share on other sites
x3minater

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!

Share this post


Link to post
Share on other sites
TheDark

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.


Desaparecido.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.