Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

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;
 }

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

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;
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

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 leute,
vielen vielen dank vür euere hilfe. das programm läuft.

Sorry Freunde,
ich sehe gerade, dass ich mich ganz schön böse vertippt habe. Es sollte natürlich "für" heißen.
:-)

Gruß Sokrates

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  :P

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

Zur Verdeutlichung:
wenn ich die Pfeiltaste gehenlasse, sollen die Portausgänge auf Null gesetzt werden.


« Turbo-Pascal Problem.....Programmbibliothek für XP-Systemzugriffe gesucht »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...