/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
ncurses
Fra : Allan Weber


Dato : 25-04-01 11:39

Jeg sidder og skal lave et program under Linux der hele tiden læser fra
keyboardet og gemmer hvert tastetryk i en variabel. Programmet skal kunne
læse hvert tastetryk uden der trykkes på enter hver gang. Jeg er blevet
anbefalet at benytte ncurses, og sidder og leger med kommandoen getch(),
men savner noget dokumentation omkring denne kommando. Nogen der kender et
godt sted, eller et nemmere måde at gøre det på??

mvh
Allan Weber

 
 
Kent Friis (25-04-2001)
Kommentar
Fra : Kent Friis


Dato : 25-04-01 13:17

Den Wed, 25 Apr 2001 12:38:52 +0200 skrev Allan Weber:
>Jeg sidder og skal lave et program under Linux der hele tiden læser fra
>keyboardet og gemmer hvert tastetryk i en variabel. Programmet skal kunne
>læse hvert tastetryk uden der trykkes på enter hver gang. Jeg er blevet
>anbefalet at benytte ncurses, og sidder og leger med kommandoen getch(),
>men savner noget dokumentation omkring denne kommando. Nogen der kender et
>godt sted, eller et nemmere måde at gøre det på??

int main() {
   chtype key;
   
   initscr(); /* Initialize ncurses */
   cbreak(); /* Don't wait for enter */
   noecho(); /* Don't show keypresses on skreen */
   keypad(stdscr,TRUE); /* Special keys (?) */
   
   while((key=getch()) >=0) {
      /* Do somehing */
   }
   
   erase(); /* Clear screen */
   refresh(); /* Update the physical screen */
   endwin(); /* Shut down ncurses */
}

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - sidste billede: garden.png

Allan Weber (25-04-2001)
Kommentar
Fra : Allan Weber


Dato : 25-04-01 13:32

Det giver følgende fejl når jeg compiler:

/tmp/cciV161O.o: In function `main':
/tmp/cciV161O.o(.text+0x7): undefined reference to `initscr'
/tmp/cciV161O.o(.text+0xc): undefined reference to `cbreak'
/tmp/cciV161O.o(.text+0x11): undefined reference to `noecho'
/tmp/cciV161O.o(.text+0x1c): undefined reference to `stdscr'
/tmp/cciV161O.o(.text+0x21): undefined reference to `keypad'
/tmp/cciV161O.o(.text+0x2d): undefined reference to `stdscr'
/tmp/cciV161O.o(.text+0x32): undefined reference to `wgetch'
collect2: ld returned 1 exit status

hvilket er ca. samme fejl som jeg har fået ved mine tidligere forsøg. Hvad
kan det skyldes??

mvh
Allan Weber

> int main() {
> chtype key;
>
> initscr(); /* Initialize ncurses */
> cbreak(); /* Don't wait for enter */
> noecho(); /* Don't show keypresses on skreen */
> keypad(stdscr,TRUE); /* Special keys (?) */
>
> while((key=getch()) >=0) {
> /* Do somehing */
> }
>
> erase(); /* Clear screen */
> refresh(); /* Update the physical screen */
> endwin(); /* Shut down ncurses */
> }
>
> Mvh
> Kent


Kent Friis (25-04-2001)
Kommentar
Fra : Kent Friis


Dato : 25-04-01 13:48

Den Wed, 25 Apr 2001 14:32:19 +0200 skrev Allan Weber:
>Det giver følgende fejl når jeg compiler:
>
>/tmp/cciV161O.o: In function `main':
>/tmp/cciV161O.o(.text+0x7): undefined reference to `initscr'
>/tmp/cciV161O.o(.text+0xc): undefined reference to `cbreak'
>/tmp/cciV161O.o(.text+0x11): undefined reference to `noecho'
>/tmp/cciV161O.o(.text+0x1c): undefined reference to `stdscr'
>/tmp/cciV161O.o(.text+0x21): undefined reference to `keypad'
>/tmp/cciV161O.o(.text+0x2d): undefined reference to `stdscr'
>/tmp/cciV161O.o(.text+0x32): undefined reference to `wgetch'
>collect2: ld returned 1 exit status
>
>hvilket er ca. samme fejl som jeg har fået ved mine tidligere forsøg. Hvad
>kan det skyldes??

En lille detalje i den linie du ikke kopierede med...

*cc -o fun -lncurses fun.c -Wall
-----------^^^^^^^^^

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - sidste billede: garden.png

Allan Weber (25-04-2001)
Kommentar
Fra : Allan Weber


Dato : 25-04-01 14:30

Takker, det var jeg ikke klar over. Et sidste spg.:
vil følgende gemme den trykkede tast i charKey:

char charKey ;

initscr(); /* Initialize ncurses */
cbreak(); /* Don't wait for enter */
noecho(); /* Don't show keypresses on skreen */
keypad(stdscr,TRUE); /* Special keys (?) */

while (charKey != 'q'){
charKey = getch();
printf("%c", charKey);
}

erase(); /* Clear screen */
refresh(); /* Update the physical screen */
endwin(); /* Shut down ncurses */

der komme ikke noget ud på skærmen, selvom printf funktionen er der, dog
stopper programmet godt nok når der trykkes q

mvh
Allan Weber

Kent Friis (25-04-2001)
Kommentar
Fra : Kent Friis


Dato : 25-04-01 19:36

Den Wed, 25 Apr 2001 15:29:51 +0200 skrev Allan Weber:
>Takker, det var jeg ikke klar over. Et sidste spg.:
>vil følgende gemme den trykkede tast i charKey:
>
> char charKey ;

Du bør bruge chtype i stedet for char her:
chtype charKey;

> initscr(); /* Initialize ncurses */
> cbreak(); /* Don't wait for enter */
> noecho(); /* Don't show keypresses on skreen */
> keypad(stdscr,TRUE); /* Special keys (?) */
>
> while (charKey != 'q'){

Medmindre der er tale om en global/static variabel, er det dit ansvar
at initialisere charKey til noget fornuftigt. Ellers er der nøjagtig
lige så stor sandsynlighed for at den indeholder 'q' første gang, som
der er for en hvilkensomhelst anden værdi.

Alternativt kan du bruge:
while((charKey=getch()) != 'q') {
....
}

eller:

do {
charKey=getch()
....
} while(charKey!='q');

> charKey = getch();
> printf("%c", charKey);

printf hører til stdio, men du bruger curses. De kan ikke bruges
samtidig. Prøv i stedet med:

mvprintw(2,1,"%c",charKey);

Skriv på linie 2, første tegn. Derefter bør du have:

refresh();

For at opdatere den fysiske skærm. ncurses giver de samme eller flere
muligheder som CRT, som du sikkert kender fra Borland.


> }
>
> erase(); /* Clear screen */
> refresh(); /* Update the physical screen */
> endwin(); /* Shut down ncurses */

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - sidste billede: garden.png

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste