vielen dank für eure detailierten darstellungen.
ich hoffe, dass ich jetzt zurecht kommen werde.
ansonsten weiss ich ja wo ich mein problem schildern kann :-)
gruß sokrates
Hallo Leute,
ich komme einfach nicht weiter. Ich bitte euch meinen Quelltext zu compilieren und dann über die Konsole zu öffnen. Ihr werdet merken, dass das Programm zwar läuft, aber jeder eingegebener Befehl erst durch einen druck auf die Entertaste ausgeführt wird. (Mit diesem Programm, will ich ein Funkauto ansteuern.)
Nun der Quelltext:
# include <stdio.h>
# include <unistd.h>
# include <asm/io.h>
#include <sys/select.h>
#include <termios.h>
#include <stropts.h>
#include <curses.h>
/* mit diesem programm m?chte ich die lpt1 schnittstelle ansteuern
die f?r die lpt1 ansteuerung n?tigen befehle habe ich auskommentiert.
wenn ihr sie mit in das programm nehmt, m?sst ihr die ports freischalten.
- ihr geht in den root modus und gebt:
chown root:root namederdatei
chmod a+s namederdatei
exit
*/
int main()
{
//iopl(3);
char taste;
bool ende = false;
while(ende != true)
{
fflush(stdin);
if (getc(stdin)) //(kbhit()) hier liegt das problem
{
taste = getchar();
switch(taste)
{
case 'w':
//outb_p(132,0x378);
printf("auto faehrt nach vorne");
usleep(32);
break;
case 's':
//outb_p(72,0x378);
printf("auto faehrt nach hinten");
usleep(32);
break;
case 'd':
//outb_p(32,0x378);
usleep(32);
printf("auto faehrt nach rechtes");
break;
case 'a':
//outb_p(1,0x378);
printf("auto faehrt nach links");
usleep(32);
break;
case 'x':
//outb_p(0,0x378);
ende=true;
break;
}
}
else
{
//outb_p(0,0x378);
}
}
return 0;
}
Nunja, das getc() hast Du ja eingebaut, benutzt dann aber trotzdem noch getchar()!! Probiers mal so:
int main()
{
//iopl(3);
char taste;
bool ende = false;
while(ende != true)
{
fflush(stdin);
taste = getc(stdin);
switch(taste)
{
case 'w':
//outb_p(132,0x378);
printf("auto faehrt nach vorne");
usleep(32);
break;
case 's':
//outb_p(72,0x378);
printf("auto faehrt nach hinten");
usleep(32);
break;
case 'd':
//outb_p(32,0x378);
usleep(32);
printf("auto faehrt nach rechtes");
break;
case 'a':
//outb_p(1,0x378);
printf("auto faehrt nach links");
usleep(32);
break;
case 'x':
//outb_p(0,0x378);
ende=true;
break;
default:
//outb_p(0,0x378);
break;
}
}
return 0;
}
Uups, sorry, ich nehme alles zurück. Habs gerade mal getestet. getc() verlangt auch die Eingabetaste!! Tja, das war wohl nix.
Dann probier doch mal Curses aus (siehe ,,,,,'s Post). Das kannte ich bis jetzt noch nicht, aber klingt doch gut.
Gruß Spawn
#include <curses.h>
// compilieren mit 'gcc -o foo foo.c -lncurses'
int main( void )
{
int quit = 0;
// curses init
initscr();
cbreak();
noecho();
keypad(stdscr,TRUE); // corsor tasten zulassen
atexit(endwin); // terminal restaurieren beim beenden
while( !quit )
{
switch( getch() )
{
case KEY_DOWN:
printw( "down\n" );
break;
case KEY_UP:
printw( "up\n" );
break;
case KEY_LEFT:
printw( "left\n" );
break;
case KEY_RIGHT:
printw( "right\n" );
break;
case 'q':
quit = 1;
break;
default:break;
}
doupdate(); // bildschirmausgaben updaten
}
return 0;
}
Hallo, ich habe eine Frage zu diesem Quelltext. Wie kann eine Abfrage einbauen: wenn eine Pfeiltaste gedrückt wird, dann soll etwas geschehen. ansonsten soll irgendetwas ausgeben werden. (printf("bla…“);
Das Fettgedruckte soll meine Lösung darstellen.
Code:
#include <curses.h>
// compilieren mit 'gcc -o foo foo.c -lncurses'
int main( void )
{
int quit = 0;
initscr();
cbreak();
noecho();
keypad(stdscr,TRUE);
atexit(endwin);
while( !quit )
{
if(getch()) //hier liegt das problem
{
switch( getch() )
{
case KEY_DOWN:
printw( "down\n" );
break;
case KEY_UP:
printw( "up\n" );
break;
case KEY_LEFT:
printw( "left\n" );
break;
case KEY_RIGHT:
printw( "right\n" );
break;
case 'q':
quit = 1;
break;
default:break;
}
else
{
printf("bla...");
}
doupdate(); // bildschirmausgaben updaten
}
return 0;
}
Was tut wohl das hier:
switch( getch() )
{
case KEY_DOWN:
printw( "down\n" );
break;
case KEY_UP:
printw( "up\n" );
break;
case KEY_LEFT:
printw( "left\n" );
break;
case KEY_RIGHT:
printw( "right\n" );
break;
case 'q':
quit = 1;
break;
default:break;
}
Jetzt versuche mal irgendwie zu erraten, was passiert, wenn eine Pfeiltaste gedrückt wird. Wenn Du meinst, die Lösung zu haben, dann versuch mal zu erraten, was passieren könnte, wenn man 'q' eintippt. Wenn Du das schliesslich erraten hast, dann könnte wohl die Masterfrage lauten: Was passiert, wenn irgendetwas anderes gedrückt wurde...
BTW.: mit NCURSES niemals printf, sondern printw
Danke für den Hinweis mit printw(" "). Eigentlich kenne ich mich kaum mit der c Programmierung unter Linux aus. Ich programmiere fast ausschließlich unter Windows (Visual C++).
Was du mir probiert hast deutlich zu machen, habe ich (hoffentlich) verstanden. Ich hatte ursprünglich vor gehabt die parallele Schnittstelle zu programmieren. (das ist mir unter Windows auch gelungen.)
Wenn ich nun eine Pfeiltaste drücke, und sie danach wieder los lasse, wird die Ausgabe printw(„nach vorne“) nicht gleich beendet.
Also möchte ich:
Solange wie ich eine Pfeiltaste drücke, soll ein Befehl ausgegeben werden.
Ich dachte mir, dass dies durch eine if Abfrage vor dem switch/case bewerkstelligt werden kann. Mir fehlt nur der entsprechende Befehl für den if-Block.
Gruß Michael
« Turbo-Pascal Problem..... | Programmbibliothek für XP-Systemzugriffe gesucht » | ||