x3minater Posted November 27, 2009 at 12:46 AM Report Share #297719 Posted November 27, 2009 at 12:46 AM 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 #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;} Link to comment Share on other sites More sharing options...
msr Posted November 27, 2009 at 02:45 AM Report Share #297726 Posted November 27, 2009 at 02:45 AM 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 🙂 COMPONENT ORGANIZER easily organize your electronic parts and application notes Link to comment Share on other sites More sharing options...
x3minater Posted November 27, 2009 at 11:05 AM Author Report Share #297738 Posted November 27, 2009 at 11:05 AM 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 =\ Link to comment Share on other sites More sharing options...
msr Posted November 27, 2009 at 11:53 AM Report Share #297747 Posted November 27, 2009 at 11:53 AM 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()". COMPONENT ORGANIZER easily organize your electronic parts and application notes Link to comment Share on other sites More sharing options...
x3minater Posted November 27, 2009 at 01:39 PM Author Report Share #297761 Posted November 27, 2009 at 01:39 PM 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 🙂 Link to comment Share on other sites More sharing options...
iCl4w Posted November 28, 2009 at 03:26 PM Report Share #297915 Posted November 28, 2009 at 03:26 PM Coloca char como variável global... char tecla; void carrega_tecla() { printf("Pressione a Tecla! "); tecla=getche(); main(); } É aparentemente SIMPLES! Link to comment Share on other sites More sharing options...
x3minater Posted November 28, 2009 at 05:58 PM Author Report Share #297926 Posted November 28, 2009 at 05:58 PM 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? =\ Link to comment Share on other sites More sharing options...
Baderous Posted November 28, 2009 at 06:06 PM Report Share #297927 Posted November 28, 2009 at 06:06 PM 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. Link to comment Share on other sites More sharing options...
x3minater Posted November 28, 2009 at 06:10 PM Author Report Share #297928 Posted November 28, 2009 at 06:10 PM 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... Link to comment Share on other sites More sharing options...
TheDark Posted November 28, 2009 at 06:14 PM Report Share #297929 Posted November 28, 2009 at 06:14 PM 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. Link to comment Share on other sites More sharing options...
x3minater Posted November 29, 2009 at 03:11 AM Author Report Share #297968 Posted November 29, 2009 at 03:11 AM 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! Link to comment Share on other sites More sharing options...
TheDark Posted November 29, 2009 at 04:33 AM Report Share #297969 Posted November 29, 2009 at 04:33 AM 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. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now