Datenmüll?



  • Hallo!

    Ich bin gerade beim Programmieren eines Snake Spieles für den Taschenrechner TI200.
    Das Problem ist folgendes: Wenn ich spiele, so befindet sich die Schlange an einer bestimmten Position(x,y). Das speichere ich in einer Struktur, besser gesagt, ich speichere es in einer Positionsliste(POS *pos), da ich auch wissen muss, wo die Schlange zuvor war.

    typedef struct s_pos
    {
    	int pos[2];
    	struct s_pos *next;
    } POS;
    

    Beende ich nun das Spiel(also ganz raus aus dem Spiel auf den HOME Screen des Betriebsystem) und starte es neu, so müsste die Schlange wieder an der Ausgangsposition sein. Ist sie aber nicht, nein, sie startet dort wo sie beim letzten Spiel zuletzt war!!!
    Wie gibts das?

    Ich setzte die Positionsliste am Programmanfang auf NULL:

    POS *pos=NULL;
    

    Außerdem erstelle ich dann die Anfangsposition folgendermaßen mit Hilfe der Funktion add_list():

    POS*  add_list(POS *start, int x, int y)
    {
      POS *neu=NULL;
    
      neu=(POS*)malloc(sizeof(POS));
    
      if(neu==NULL)
        return NULL;
    
      else
      {
      	neu->pos[0]=x;
      	neu->pos[1]=y;
      	if(start!=NULL)//die if Abfrage hätte ich mir sparen können, aber probieren muss man alles.
      	neu->next=start;
      	else
      	neu->next=NULL;
      }  
    	return neu;
    }
    

    Am Ende des Programms lösche ich sogar die Liste:

    while(t!=NULL)//wobei t vom Typ POS* ist, eine Temp Variable sozusagen
    {
    	if(pos->next!=NULL)
    	  t=pos->next;
    	else
    	  t=NULL;
    
    	free(pos);
    
    	pos=t;
    }
    

    Also ich versteh die Welt nicht mehr. Eigentlich müsste ich so eine Lite doch gar nicht free-en, wenn das Programmeh beendet wird? Da wird der Speicher eh wieder freigegeben!?
    Außerdem müsste die Liste, wenn sie schon den gleichen Speicheradresse wieder hernimmt, doch überschrieben werden!?

    Woher kommen also die Koordinaten der Schlange(x,y), die es eigentlich schon gar nicht mehr geben dürfte?

    Grüße,
    Harri



  • lerne es!
    speicher immer free()n!
    immer!



  • c.rackwitz schrieb:

    lerne es!
    speicher immer free()n!
    immer!

    falsch! nur wenn er gemalloc()d ist.



  • harry3 schrieb:

    Woher kommen also die Koordinaten der Schlange(x,y), die es eigentlich schon gar nicht mehr geben dürfte?

    Das TI OS ist halt kein Windows, wer weiß wo die da was abspeichern, frag doch mal bei TI nach. Ansonsten, wie wärs mit der Alternative einfach beim Beenden des Programmes die letzten Koordinaten auf den Startpunkt zu setzen?

    bye

    tt



  • wieso beim beenden?
    gewöhnlich initialisiert man beim starten... wenn du das machen würdest, wäre die schlange auch dort, wo du sie haben willst.



  • Erstmal danke für Eure Antworten.

    Gehn wirs mal der Reihe nach druch:

    @c.rackwitz: Hab ich ja gemacht. Bringt nix.

    @TheTester: Ja, das ist das erste was ich mache: Ich setze den Startpunkt auf 0,0. Der Pointer *next zeigt natürlich auf NULL. Aber anscheinend hat dieser NULL Pointer magische Fähigkeiten....er zeigt auf einen Bereich, wo interessanterweise die letzten Koordinaten drinnen stehen.

    @c.rackwitz: Nochmal zu dir: Nur keine Sorge, zuerst setze ich die Liste auf NULL, und dann bekommt sie einen Startwert von 0,0.

    Ich wende mich mal an den Compilerbauer von TIGCC.

    Schönen Abend noch,
    Harri



  • Problem gelöst:

    Globale Variablen werden nicht auf NULL gesetzt:
    http://tigcc.ticalc.org/doc/faq.html#29

    Grüße,
    Harri


Anmelden zum Antworten