Programm funktioniert nicht richtig.



  • Hi,
    ich sitze nun ewig an einem stück code und bekomm es einfach nicht vernünftig zum laufen. Ich hoffe ihr könnt mir helfen.
    Es soll folgendermaßen laufen:
    Wenn man die rechte Maustaste im gedrückten zustand nach unten bewegt, wird eine 2 ausgegeben. Nach rechts 3 usw. ...

    Kann man sich auch am nummerpad (hoffe es heißt so) verdeutlichen:

    oben
    
           789
    links  4 6   rechts
           123 
    
           unten
    

    Das ist glaube ich so verständlich.
    Nun habe ich das Problem, dass immer eine 3 ausgegeben wird, obwohl ich die Maus nicht von der stelle bewege (jedenfalls nicht mehr als der toleranzwert [variable: dif = toleranzwert in pixel] angibt.). Auch wenn ich die Maus nach oben bewge kommt eine 3, vermischt mit difersen anderen unsinnigen zahlen, obwohl nur achten ausgegeben werden sollten.

    Viel gerede, der code erklärt den rest und eigentlich auch sich selbst. Bei fragen beantworte ich sie gerne. Ich hoffe meine ist beantwortbar, weil ich selbst daran total verzweifel.

    #include <iostream>
    #include <windows.h>
    #include <math.h>
    #include <stdio.h>
    
    int main() {
    
    POINT mPos;
    BOOL rc;
    int x,y=0;
    float lx,ly=0;
    float dx,dy =0;
    short dif=20;
    
     while(1) {
       while(GetAsyncKeyState(VK_RBUTTON)/* & 0x8000*/)  {  // rechte Maustaste gedrückt?
        rc = GetCursorPos(&mPos);  
        x = mPos.x;
        y = mPos.y;
        Sleep(500);
    
        dx = x - lx;
        dy = y - ly;
        if(dx>dif || dy>dif) {
    
          // Rückgabewert entspricht Ziffer auf Nummernpad
          if( (fabs(dx)<dif) && (fabs(dy)<dif) ) printf("0");;
            if( fabs(dx) < fabs( dy / 2 ) ) {
              // vertikale Bewegung
              if( dy > 0 ) printf("2");;
              if( dy < 0 ) printf("8");;
            }
    
          if( fabs(dy) < fabs( dx / 2 ) ) {
            // horizontale Bewegung
            if( dx > 0 ) printf("6");;
            if( dx < 0 ) printf("4");;
          }
    
         // Diagonale Bewegung
         if( (dx > 0) && (dy > 0 ) ) printf("3");;
         if( (dx > 0) && (dy < 0 ) ) printf("9");;
         if( (dx < 0) && (dy > 0 ) ) printf("1");;
         if( (dx < 0) && (dy < 0 ) ) printf("7");;
    
          dy = 0; 
          dx = 0;
          /* zuvor hatte ich hier jede variable wieder auf null gestellt, da es aber nichts verändert hat, schreibe ich es hier nicht wieder hin. */
    
    	}
    
       }
    
     }
    return 0;
    }
    

    Danke schonmal. 🙂



  • int x,y=0;
    float lx,ly=0;
    float dx,dy =0;
    

    dir ist klar, das hier nur y,ly,dy auf 0 initaliert werden..

    deswegen ist gleich anfangs:

    dx = x - lx;
        dy = y - ly;
    

    undefiniert.. deswgen evtl. de fehler...

    wenn debuggen würdest , würdest den fehler evtl. erkenne. 😃



  • Hi!
    Diese ständige Abfrage der Maus ( Polling ) ist nicht so gut, weil es wertvolle Prozessorzeit in Anspruch nimmt.
    Besser man nimmt interrupt-basierte Funktionen. In Windowsprogrammen empfängt man die WM_MBUTTONDOWN Nachricht und für die Konsole nimmt man lieber die Funktion ReadConsoleInput.



  • B.B. schrieb:

    Diese ständige Abfrage der Maus ( Polling ) ist nicht so gut, weil es wertvolle Prozessorzeit in Anspruch nimmt.

    es kommt drauf an. wenn der prozessor sonst nix zu tun hat, ist das in ordnung. bis vielleicht auf einen leicht erhöhten energieverbrauch (bei manchen systemen).
    🙂



  • fricky schrieb:

    B.B. schrieb:

    Diese ständige Abfrage der Maus ( Polling ) ist nicht so gut, weil es wertvolle Prozessorzeit in Anspruch nimmt.

    es kommt drauf an. wenn der prozessor sonst nix zu tun hat, ist das in ordnung. bis vielleicht auf einen leicht erhöhten energieverbrauch (bei manchen systemen).
    🙂

    Klar. Der Prozessor hat ja auch nichts weiter zu tun, als sich mit meiner 'where mouse main' zu befassen.



  • keine panik

    Sleep(100);
    

    und es ist ok



  • B.B. schrieb:

    Klar. Der Prozessor hat ja auch nichts weiter zu tun, als sich mit meiner 'where mouse main' zu befassen.

    wie gesagt: es kommt drauf an...
    🙂



  • BorisDieKlinge schrieb:

    keine panik

    Sleep(100);
    

    und es ist ok

    Ist auch nicht zu empfehlen. Findet in dieser Pause ein Klick statt, kann nach Sleep der Mauszeiger ganz woanders sein und man bekommt falsche Ergebnsisse.



  • oh man..

    while(1) {
       if(GetAsyncKeyState(VK_RBUTTON)){
       // do bullshit
       }
      else 
        sleep(100);
    }
    


  • Sleep(1) reicht völlig aus.



  • BorisDieKlinge schrieb:

    oh man..

    while(1) {
       if(GetAsyncKeyState(VK_RBUTTON)){
       // do bullshit
       }
      else 
        sleep(100);
    }
    

    Meinst du etwa, das im else Zweig kein Klick stattfinden kann ?
    Oh Frau.. 🙄



  • schlafwissenschaftler schrieb:

    Sleep(1) reicht völlig aus.

    Sleep(0) ist besser. das gibt einfach nur die angefangene zeitscheibe sofort ab, ohne den thread für einen systemtick schlafen zu legen.
    🙂



  • fricky schrieb:

    schlafwissenschaftler schrieb:

    Sleep(1) reicht völlig aus.

    Sleep(0) ist besser. das gibt einfach nur die angefangene zeitscheibe sofort ab, ohne den thread für einen systemtick schlafen zu legen.
    🙂

    Noch besser ist, Sleep(-1). Dann werden die Mausklicks vorhergesagt.



  • Zukunftsvisionär schrieb:

    Noch besser ist, Sleep(-1). Dann werden die Mausklicks vorhergesagt.

    was aber egal ist, weil sämtliche mausklicks bei 'Sleep(-1)' das programm nicht interessieren werden.
    🙂



  • B.B. schrieb:

    Meinst du etwa, das im else Zweig kein Klick stattfinden kann ?
    Oh Frau.. 🙄

    spielt keine rolle, wo sich die mauss nacher befindet, er will nur die richtung "WÄHREND" des gedrückhalten wissen nich den weg o. positipon



  • schlafwissenschaftler schrieb:

    Sleep(1) reicht völlig aus.

    Womit wir wieder beim Polling-Problem wären.



  • Nagut, auf die Probleme bezüglich Polling und Sleep ist ja der OP hingewiesen worden. Sich für eine Variante zu entscheiden liegt bei ihm.

    Zum Problem selbst:
    Verzichte auf float, fabs und co.
    Die Bildschirmkoordinaten sind long Werte.
    Du brauchst eine zweite Variable vom Typ POINT, um die Koordinatendifferenzen bilden zu können:

    #include <stdio.h>
    #include <windows.h>
    
    #define PFUI_1 1
    #define PFUI_2 100
    
    int main()
    {
    	POINT now, before;
    	long dx, dy;
    
    	GetCursorPos( &before );
    
    	while ( PFUI_1 )
    	{
    		Sleep ( PFUI_2 );
    
    		while ( GetAsyncKeyState( VK_RBUTTON ) )
    		{  
    			GetCursorPos( &now );
    
    			dx = now.x - before.x;
    			dy = now.y - before.y;
    
    			if ( dy > 0 && dx > 0 )
    				printf( "3\r" );
    
    			if ( dy < 0 && dx > 0 )
    				printf( "9\r" );
    
    			if ( dy > 0 && dx < 0 )
    				printf( "1\r" );
    
    			if ( dy < 0 && dx < 0 )
    				printf( "7\r" );
    
    			if ( dx > 0 && dy == 0 )
    				printf ( "6\r" );
    
    			if ( dx < 0 && dy == 0 )
    				printf ( "4 \r" );
    
    			if ( dy > 0 && dx == 0 )
    				printf ( "2\r" );
    
    			if ( dy < 0 && dx == 0 )
    				printf ( "8\r" );
    
    		   before = now;
    		}
       	}
    	return 0;
    }
    

    🙂



  • Woar, herzlichen dank B.B.

    Ich habe es einbisschen verändert. Wenn man die Maus nach oben links so in das Gebiet lenkt, passiert nichts ( 4 - 7 - 8 ). Weiß wer warum?

    #include <stdio.h>
    #include <windows.h>
    
    #define WARTE 1000
    
    int main()
    {
        POINT now, before;
        long dx, dy;
    	long dif = 10;
    
        GetCursorPos( &before );
    
        while ( 1 )
        {
             Sleep ( WARTE );
    
            while ( GetAsyncKeyState( VK_RBUTTON ) )
            {  
                GetCursorPos( &now );
    
                dx = now.x - before.x;
                dy = now.y - before.y;
    			if(dx>dif || dy>dif) { 
    			    if ( dy > 0 && dx > 0 )  printf( "3" );
    				if ( dy < 0 && dx > 0 )	 printf( "9" );
    				if ( dy > 0 && dx < 0 )	 printf( "1" );
    				if ( dy < dif && dx < dif )	 printf( "7" );
    			    if ( dx > 0 && dy == 0 ) printf ( "6" );
    				if ( dx < 0 && dy == 0 ) printf ( "4" );
    				if ( dy > 0 && dx == 0 ) printf ( "2" );
    				if ( dy < 0 && dx == 0 ) printf ( "8" );
    
    			   before = now;
    			}
    
            }
    		printf("\n");
    			now.x = 0;
    			now.y = 0;
    			before.x = 0;
    			before.y = 0;
    			dx = 0;
    			dy = 0;
           }
        return 0;
    }
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vielleicht hat es mit dem treiber zu tun?


Anmelden zum Antworten