Snake



  • Hi,

    ich muste in der Schule mal ganz simpel Snake progen.
    Jetzt wollte ich da mal struktur mit hilfe von funktionen reinbringen.
    Ich steuere die schlange mit w,a,s,d ich habe einen switch case verweis für w,a,s,d. Was in dem verweis passiert möchte ich dann in eine struktur auslagern. was in dem case steht klappt auch nur wenn ich das dann in eine struktur packe meckert er nicht beim debuggen sondern wenn ich die taste drücke das er auf i-welche positionen nicht zugreifen könnte.

    mein Funktion aufruf:

    a(&st, &xgo, &ygo, xdl, &sx, ydl, &sy, &sl, &sxdl, &sydl, &prüf, &sfax2, &sfex, &xp, &yp, &c);
    

    funktion:

    void a(int *st, int *xgo, int *ygo, int *xdl, int *sx, int *ydl, int *sy, int *sl, int *sxdl, int *sydl, int *prüf, int *sfax2, int *sfex, int *xp, int *yp, char *c)
    {
    	do
    	{
    		Sleep(*st);                      // Geschwindigkeit in der sich die Schlange bewegt
            gotoxy(*xgo,*ygo);                // Geht zur nächsten bzw. alten Kopf Position wo das nächste Segement geschreiben wird
    		printf("*");                    // Schreibt das nächste Segment
    		xdl[*sx]=*xgo;                    // Speicher in dem Array die Aktuelle erste X-Achsen Segment Position       
    		ydl[*sy]=*ygo;                    // Speicher in dem Array die Aktuelle erste Y-Achsen Segment Position    
    		if(*sx==*sl&&*sy==*sl) *prüf=1;      // Prüft ob die Array für die sl einmal komplet belegt sind
    		if(*sxdl>*sl&&*sydl>*sl)            // Prüft ob größe des Array > der sl ist
    		{
    			*sxdl=0;                     // Setzt sie wieder auf 0 sprich auf das erste Segment
    			*sydl=0;                     // Setzt sie wieder auf 0 sprich auf das erste Segment
    		}
    		if(*prüf==1)                     // Prüft ob die Schalnge einmal komplett geschreiben, 
    		{
    			gotoxy(xdl[*sxdl],ydl[*sydl]);        // Geht zum letzten Segemnt der Schlange
    			printf(" ");                        // Überschreibt es
    			*sxdl++;                             // erhöt die X-Achsen Array Positionen wo gelöscht werden soll
    			*sydl++;                             // erhöt die Y-Achsen Array Positionen wo gelöscht werden soll   
    		}
    		if(*sx==*sl&&*sy==*sl)              //Prüft ob die Größe des Arrays gleich der sl ist
    		{
    			*sx=0;                       // setzt sx wieder auf 0
    			*sy=0;                       // setzt sy wieder auf 0
    		}
    		else
    		{
    			*sx++;                       // +1 für die nächste Array Speicherrung
    			*sy++;                       // +1 für die nächste Array Speicherrung
    		}
    		*xgo--;                          // -- damit die Schlange 1 nach oben geht
    		if(*xgo==*sfax2)                  // Prüft ob die Schlange oben aus dem Spielfeld läuft    
    		{
    			*xgo=*sfex-1;                 // Geht zum unterem Spielfeld            
    		}
    		*xp=0;                           // Setzt den Prüfwert wieder auf 0
    		*yp=0;                           // Setzt den Prüfwert wieder auf 0
    		while(*xp<=*sl)                   // Solange xp UND yp kleiner gleich der sl
    		{
    			if(*xgo==xdl[*xp]&&*ygo==ydl[*yp]) *c=27;        // Wenn der neue Kopf die Alten Segment berührt dan ist c die abbruch bedingung
    			*xp++;                       // Erhöht den prüfwert um 1
    			*yp++;                       // Erhöht den prüfwert um 1
    		}
    		gotoxy(*xgo,*ygo);                // Geht zur neune Kopf Position     
    		printf("O");                    // Schreibt den neune Kopf                            
    		if(_kbhit())                    // Wenn eine taste gedrück wurde             
    		{
    			*c=_getch();                 // c wird die taste zu gewiesen
    			if(*c=='d'||*c!='w'&&*c!='s'&&*c!='p'&&*c!=27) *c='a';        // Schaut das nur etwas passiert wenn es in diesem falle ok ist
    		}  
    	}while(*c=='a');						// Bewegungs wechsel oder Abbruch bedingung   
    }
    

    Wenn ich das Programmstarte und direkt a drücke kommt der fehler bei zeile 42.

    ich habe echt keine ahnung was ich da falsch gemacht habe also wenn ich die funktion so zu sagen wieder in switch case für die tasten hinnein packe klapt alles also muss es ja mit den werte parametern zusammen hängen.

    Danke schon mal


  • Mod

    Was für ein Fehler kommt? Ich rate mal, dass einer der Pointer die du in der Zeile dereferenzierst ungültig ist. Ein Debugger sollte dir dabei weiterhelfen.

    Tut das Not, dass die Funktion so derbe viele Parameter hat? Kann man das nicht etwas aufteilen oder Variablen sinnvoll zu structs zusammenfassen? Und müssen das wirklich alles Pointer sein? So wie es aussieht nicht.



  • Hi,

    also Debuggen habe ich alles da kommt kein fehler auch keine warnung.

    Allesdings beim ausführen wenn ich da "a" drücke kommt diese meldung
    "Unbehandelte Ausnahme bei 0x00ff5875 in Snake 7.0.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x3370296c."

    Strkturen ja das könnte ich machen wollte halt wegen der übersichtlichekeit erst mal alles in Funktionen packen.

    Ich habe einfach mal alles zu pointern gemacht damit da schon mal villeicht fehler wegfallen. Schaden kann es ja meine ich nicht.

    Bin sehr dankebar für weitere tipps


  • Mod

    ProNoob schrieb:

    also Debuggen habe ich alles da kommt kein fehler auch keine warnung.

    Debuggen ist etwas anderes als du denkst. Da das wichtig ist, solltest du dich mal kundig machen, was man damit meint.

    Allesdings beim ausführen wenn ich da "a" drücke kommt diese meldung
    "Unbehandelte Ausnahme bei 0x00ff5875 in Snake 7.0.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x3370296c."

    Das bestätigt meine Vermutung.

    Strkturen ja das könnte ich machen wollte halt wegen der übersichtlichekeit erst mal alles in Funktionen packen.

    Und findest du den jetzigen Zustand übersichtlich?

    Ich habe einfach mal alles zu pointern gemacht damit da schon mal villeicht fehler wegfallen. Schaden kann es ja meine ich nicht.

    Du machst alles zu Pointer, um Fehler zu vermeiden? 😮
    Und du meinst, es könne nicht schaden, alles Pointern zu machen? 😮



  • Ich benutze Visual Studio 2010.
    Wenn ich auf Debuggin klicke startet er das programm und in der fehler liste tauchen keine fehler auf alles bis auf nach links (a) sobalt ich auf a klicke taucht der fehler auf.

    Strukturen werden noch kommen habe halt erst mal mit funktionen angefangen. das ich alles zu pointern gemacht habe war halt aus dem grund das der fehler kommt und ich erst mal versuchen wollte diesen zu um gehen.

    ich weiß halt nicht wie ich jetzt mit dem fehler umgehen soll.

    deswegen frage ich hier um hilfe.

    Es wäre nett wenn man mir hier mal einen ersten anlaufs punkt geben kann 🙂

    Trozdem schon mal vielenen dank



  • Mein Anhaltspunkt: Setz einen Breakpoint auf den Funktionsaufruf. Wenn der anschlägt, kannst du Schritt für Schritt verfolgen, wo der Fehler tatsächlich auftritt.

    PS: Übrigens verwendet man Pointer eher in Ausnahmen. Normale Parameter solltest du lieber per Wert übergeben (oder als Referenz, wenn die Funktion sie für Antworten an den Aufrufer nutzen soll).


  • Mod

    ProNoob schrieb:

    Ich benutze Visual Studio 2010.
    Wenn ich auf Debuggin klicke startet er das programm und in der fehler liste tauchen keine fehler auf alles bis auf nach links (a) sobalt ich auf a klicke taucht der fehler auf.

    Strukturen werden noch kommen habe halt erst mal mit funktionen angefangen. das ich alles zu pointern gemacht habe war halt aus dem grund das der fehler kommt und ich erst mal versuchen wollte diesen zu um gehen.

    ich weiß halt nicht wie ich jetzt mit dem fehler umgehen soll.

    deswegen frage ich hier um hilfe.

    Es wäre nett wenn man mir hier mal einen ersten anlaufs punkt geben kann 🙂

    Trozdem schon mal vielenen dank

    Jetzt hast du inhaltlich deinen zweiten Beitrag 1:1 wiederholt, was soll ich da anderes antworten, als das was ich in meinem zweiten Beitrag geantwortet habe?



  • ProNoob schrieb:

    Wenn ich das Programmstarte und direkt a drücke kommt der fehler bei zeile 42.

    Wie entfuhr es doch kürzlich der Queen bei Vorabbetrachtung des Brautkleides von Kate?
    "It's horrible!".
    Wenn es tatsächlich an Zeile 42 liegt, könnte es an einem lesenden/schreibenden Zugriff auf nichtdefinierte Speicherbereiche liegen,
    d.h. *xp oder/und *yp könnten z.B. unsinnige Werte enthalten.



  • ganz ehrlich. Wenn Snake auch sicher kein 3-Zeiler ist, brauchst du dich nicht wundern, wenn Du bei Funktionen mit Drölf Übergabeparametern als Pointer nicht mehr durchblickst.

    Es wurde Dir jetzt mehrmals angeraten, einen "Breakpoint" zu setzen und Step by Step das programm durchzugehen. Wenn dann der Fehler kommt, lässt Du Dir die dazugehörigen Werte an der Speicheradresse anzeigen und wirst Dich erneut wundern, was da zu finden ist.
    Wenn ich hier auf der Arbeit ein solches Programm warten müsste, würde ich den "Verursacher" postwendend zur Rede stellen... Abgesehen davon, dass ich sicher schon schlimmeren Code produziert und gewartet habe 😉

    Aber halt Dich ruhig mal an die Ratschläge der netten Herren hier, die haben Dir womöglich einige Jahre Erfahrung in C voraus.


Anmelden zum Antworten