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

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

Månedens bedste
Årets bedste
Sidste års bedste