|
| Om pause routine Fra : Morten |
Dato : 02-12-01 20:12 |
|
Hej.
Hvordan skrive man en rutine, som stopper et program indtil brugeren trykker
på en tilfældig tast?
Hilsen Morten.
| |
Bertel Lund Hansen (03-12-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 03-12-01 20:57 |
|
Morten skrev:
>Hvordan skrive man en rutine, som stopper et program indtil brugeren trykker
>på en tilfældig tast?
I ren C kan det klares så der skal trykkes på to taster (eller
blot <Return>):
gets();
I ikke-ren C, men dog med en ret udbredt rutine, kan det klares
med ét tastetryk:
#include <conio.h>
...
getch();
--
Bertel
http://lundhansen.dk/bertel/ FIDUSO: http://fiduso.dk/
| |
Byrial Jensen (03-12-2001)
| Kommentar Fra : Byrial Jensen |
Dato : 03-12-01 22:48 |
|
Bertel Lund Hansen <nospam@lundhansen.dk> skrev:
> Morten skrev:
>
>>Hvordan skrive man en rutine, som stopper et program indtil brugeren trykker
>>på en tilfældig tast?
>
> I ren C kan det klares så der skal trykkes på to taster (eller
> blot <Return>):
> gets();
Det virker ikke af flere forskellige grunde:
- Der mangler "include <stdio.h>" til at give gets()'s prototype.
- gets() tager et argument (en stringpointer). (Fejlen i kaldet
opdages af oversætteren hvis man havde husket include-filen).
- gets() er ekstremt farlig og usikker. Den kan ikke bruges uden
risiko for bufferoverløb. Brug den aldrig. Glem at den eksisterer.
> I ikke-ren C, men dog med en ret udbredt rutine, kan det klares
> med ét tastetryk:
>
> #include <conio.h>
> ...
> getch();
Ret udbredt? Måske inden for oversættere til MS-DOS- og
MS-Windows-systemer. Men ikke andre steder så vidt jeg ved.
| |
Bertel Lund Hansen (03-12-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 03-12-01 23:44 |
|
Byrial Jensen skrev:
>> getch();
>Ret udbredt? Måske inden for oversættere til MS-DOS- og
>MS-Windows-systemer. Men ikke andre steder så vidt jeg ved.
Jeg havde fået det indtryk at den også var tilgængelig under
Linux, men det må så være forkert. Det er måske bare pakken
conio.h der også findes?
--
Bertel
http://lundhansen.dk/bertel/ FIDUSO: http://fiduso.dk/
| |
Martin Moller Peders~ (04-12-2001)
| Kommentar Fra : Martin Moller Peders~ |
Dato : 04-12-01 00:29 |
|
In <0vvn0uscvf4fobsl6ohbbc7o0tjvo8apqd@sunsite.auc.dk> Bertel Lund Hansen <nospam@lundhansen.dk> writes:
>Byrial Jensen skrev:
>>> getch();
>>Ret udbredt? Måske inden for oversættere til MS-DOS- og
>>MS-Windows-systemer. Men ikke andre steder så vidt jeg ved.
>Jeg havde fået det indtryk at den også var tilgængelig under
>Linux, men det må så være forkert. Det er måske bare pakken
>conio.h der også findes?
conio.h findes ikke som en del af gcc-compileren, som er den compileren, man
normalt bruger under Linux.
Derimod findes
int getch(void);
i curses.h, som er en pakke, som normalt er installeret paa en linux-maskine.
Mvh
Martin
| |
Byrial Jensen (07-12-2001)
| Kommentar Fra : Byrial Jensen |
Dato : 07-12-01 21:40 |
|
Martin Moller Pedersen <tusk@daimi.au.dk> skrev:
>Bertel Lund Hansen <nospam@lundhansen.dk> writes:
>>Byrial Jensen skrev:
>
>>>> getch();
>
>>>Ret udbredt? Måske inden for oversættere til MS-DOS- og
>>>MS-Windows-systemer. Men ikke andre steder så vidt jeg ved.
>
>>Jeg havde fået det indtryk at den også var tilgængelig under
>>Linux, men det må så være forkert. Det er måske bare pakken
>>conio.h der også findes?
>
> conio.h findes ikke som en del af gcc-compileren, som er den compileren, man
> normalt bruger under Linux.
> Derimod findes
> int getch(void);
> i curses.h, som er en pakke, som normalt er installeret paa en linux-maskine.
Ja, getch() er navnet på en funktion i ncurses-biblioteket som
bruges bl.a. på Linux, men den gør ikke det her i tråden ønskede.
Den giver et indtastet tegn - præcist som getc() kan gøre det.
Det afhænger af terminaldriverens indstillinger om der ventes på en
hel linje eller blot en enkelt tast - igen præcist som for getc().
Der er ingen god grund til at bruge ncurses-biblioteket (som i
øvrigt er udmærket hvis man har brug den funktionalitet som det
tilbyder) blot for at kunne kalde getch() i stedet for getc().
Her er et eksempel på hvordan man gør det ønskede i Linux med en
standard getchar().
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
struct termios termios;
int rc;
int ch;
/* Aflæs terminalindstillinger for stdin */
rc = tcgetattr (STDIN_FILENO, &termios);
if (rc)
{
perror ("tcgetattr() fejl");
return EXIT_FAILURE;
}
/* Slå linjeredigering og -bufring fra */
termios.c_lflag &= ~ICANON;
rc = tcsetattr (STDIN_FILENO, TCSANOW, &termios);
if (rc)
{
perror ("tcsetattr() fejl");
return EXIT_FAILURE;
}
fputs ("Tryk på en tast: ", stdout);
ch = getchar ();
putchar ('\n');
if (ch != EOF)
{
if (isprint (ch))
printf ("Du trykkede '%c'\n", ch);
else
printf ("Du indtastede tegn nr. %d\n", ch);
}
/* Slå linjeredigering og -bufring til igen */
termios.c_lflag |= ICANON;
rc = tcsetattr (STDIN_FILENO, TCSANOW, &termios);
if (rc)
{
perror ("tcsetattr() fejl");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
| |
Morten (04-12-2001)
| Kommentar Fra : Morten |
Dato : 04-12-01 16:38 |
|
"Bertel Lund Hansen" <nospam@lundhansen.dk> skrev i en meddelelse
news:10mn0u80583fhol6i0khrb6060gubkituc@sunsite.auc.dk...
> Morten skrev:
>
> >Hvordan skrive man en rutine, som stopper et program indtil brugeren
trykker
> >på en tilfældig tast?
>
> I ren C kan det klares så der skal trykkes på to taster (eller
> blot <Return>):
> gets();
>
> Bertel
Jeg tænker også om man måske kunne skrive et lille inline assembler program,
som bruger BIOS funktionerne. Men i så fald hvilke funktion(er) ville være
hensigtsmæssig? Skriv endelig et forslag, for det er meget længe siden at
jeg har beskeftiget mig med maskinkodning. Jeg ved godt, at dette ikke er en
gruppe for assembler spørgsmål, og skulle måske sendes til en anden gruppe.
| |
Bertel Lund Hansen (04-12-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 04-12-01 18:07 |
|
Morten skrev:
>Jeg tænker også om man måske kunne skrive et lille inline assembler program,
>som bruger BIOS funktionerne.
Det aner jeg intet om. Jeg har benyttet DOS' systemrutiner, men
når getch() kan det samme, ser jeg ingen grund til at fedte med
dem - medmindre man vil skrive rene assemblerprogrammer,
naturligvis. Hvad ville du opnå?
Husk Byrials advarsel (som jeg havde glemt), og brug fgets() i
stedet for gets():
#include <stdio.h>
enum { LENGTH = 20 };
char ind[LENGTH];
fgets(ind,LENGTH,'');
--
Bertel
http://lundhansen.dk/bertel/ FIDUSO: http://fiduso.dk/
| |
Anders Bo Rasmussen (05-12-2001)
| Kommentar Fra : Anders Bo Rasmussen |
Dato : 05-12-01 00:41 |
|
On Tue, 4 Dec 2001 16:38:09 +0100,
Morten <mozart@mobilixnet.dk> wrote:
> Jeg tænker også om man måske kunne skrive et lille inline assembler program,
> som bruger BIOS funktionerne. Men i så fald hvilke funktion(er) ville være
> hensigtsmæssig? Skriv endelig et forslag, for det er meget længe siden at
> jeg har beskeftiget mig med maskinkodning. Jeg ved godt, at dette ikke er en
> gruppe for assembler spørgsmål, og skulle måske sendes til en anden gruppe.
Det er vist nøjagtig det getch gør på dos. Den nye løsning er
overhovedet ikke portabel, da det vil virke på et mindre antal platforma
end getch.
--
Like a rat in a maze Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
The path before me lies Frimestervej 42 1.tv http://www.fuzz.dk
And the pattern never alters 2400 Kbh. NV
Until the rat dies.
| |
|
|