Return Werte von getch() nicht normiert ?



  • Hallo zusammen,
    ich bin immer noch dabei ein Win32 Programm nach Linux zu portieren. Ich habe nun ein neues Problem. Im Win32 Programm wird getch() verwendet um Zeichen von der Console einzulesen. Unter Linux habe ich von folgender Seite:

    http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel6b.shtml

    diesen Beispielcode verwendet um getch() zu portieren:

    #include <stdio.h>
    #include <unistd.h>
    #include <termios.h>
    
    enum{ERROR=-1, SUCCESS};
    
    static struct termios new_io;
    static struct termios old_io;
    
    /*Funktion schaltet das Terminal in den raw-Modus:*/
    /*Folgende Eingabeflags werden gelöscht : BRKINT, ICRNL, INPCK, ISTRIP, IXON*/
    /*Folgende Kontrollflags werden gelöscht: CSIZE, PERENB*/
    /*Folgende Ausgabeflags werden gelöscht : OPOST*/
    /*Folgende Kontrollflags werden gelöscht: ECHO, ICANON, IEXTEN, ISIG*/
    /*Gesetzt wird das Kontrollflag CS8 was Bedeuteted das ein Zeichen 8 Bit breit ist*/
    /*Steuerzeichen : Leseoperation liefert 1 Byte VMIN=1 VTIME=1 */
    
    int raw(int fd)
    {
    /*Sichern unseres Terminals*/
     if((tcgetattr(fd, &old_io)) == ERROR)
         return ERROR;
    
     new_io = old_io;
    
    /*Wir verändern jetzt die Flags für den raw-Modus*/
    
     new_io.c_iflag = new_io.c_iflag & ~(BRKINT|ICRNL|INPCK|ISTRIP|IXON);
     new_io.c_oflag = new_io.c_iflag & ~(OPOST);
     new_io.c_cflag = new_io.c_cflag & ~(CSIZE|PARENB);
     new_io.c_lflag = new_io.c_lflag & ~(ECHO|ICANON|IEXTEN|ISIG);
     new_io.c_cflag = new_io.c_cflag | CS8;
     new_io.c_cc[VMIN] = 1;
     new_io.c_cc[VTIME]= 0;
    
    /*Jetzt setzten wir den raw-Modus*/
    
     if((tcsetattr(fd, TCSAFLUSH, &new_io)) == ERROR)
           return ERROR;
    
     return SUCCESS;
    }
    
    /*Funktion zur Abfrage einer Taste*/
    
    int getch()
    {
     int c;
    
     if(raw(STDIN_FILENO) == ERROR)
       {
         printf("Fehler bei der Funktion raw......\n");
         exit(0);
       }
    
     c = getchar();
    
    /*Alten Terminal-Modus wiederherstellen*/
    
     tcsetattr(STDIN_FILENO, TCSANOW, &old_io);
    
     return c;
    }
    
    int main()
    {
     int zeichen;
    
     printf("Bitte 'q' drücken um das Programm zu beenden!\n");
     while((zeichen=getch()) != 'q');
    
     return 0;
    }
    

    Das klappt auch ganz prima, nur unterscheiden sich die Rückagabewerte bei Sondertasten wie zb bei "Pfeil hoch":

    Linux:
    27
    91
    65

    von der Win32 Funktion:

    Win32:
    224
    72

    Das ist natürlich äußerst unschön. Gibt es da eine elegante Möglichkeit das anzupassen ohne eine "komplizierte" Wrapperschicht einzubauen ?



  • vielleicht klappt ja das hier:

    if( zeichen == 27 ) zeichen = 224;
    

    :p
    im übrigen hast du vergessen cstdlib zu inkludieren( wegen exit() )


Anmelden zum Antworten