Problem mit einfach verketteter Liste



  • Moin,

    ich schreibe grade ein kleines Grafisches Programm in dem ich unter anderem über SDL buttons erzeuge, welche ich in einer List ablege. Den ersten button hinzuzufügen klappt und der wird auch angezeigt, aber ab dem Zweiten passiert nichtsmehr. Der Pointer auf das nächste element ist einfach NULL und ich finde den fehler nicht.

    Hier der Sourcecode:

    void AddButton (ButtonList ** Buttons, int x, int y, SDL_Surface * Active, SDL_Surface * Inactive, void (*Callback) (SDL_Surface * screen, int * done)) {
    	ButtonList * Ref;
    	if ((*Buttons) == NULL) {
    		(*Buttons) = malloc (sizeof (ButtonList));
    		(*Buttons)->x = x;
    		(*Buttons)->y = y;
    		(*Buttons)->Active = Active;
    		(*Buttons)->Inactive = Inactive;
    		(*Buttons)->Callback = Callback;
    		(*Buttons)->Index = 0;
    		(*Buttons)->IsActive = 0;
    		(*Buttons)->Next = NULL;
    	} else {
    		Ref = (*Buttons);
    		while (Ref->Next != NULL) { Ref = Ref->Next; }
    		Ref->Next = malloc (sizeof (ButtonList));
    		Ref->Next->x = x;
    		Ref->Next->y = y;
    		Ref->Next->Active = Active;
    		Ref->Next->Inactive = Inactive;
    		Ref->Next->Callback = Callback;
    		Ref->Next->Index = Ref->Index + 1;
    		Ref->Next->IsActive = 0;
    		Ref->Next = NULL;
    	}	
    }
    

    und hier der Struct ButtonList:

    typedef
    		struct ButtonList {
    			SDL_Surface * Active;
    			SDL_Surface * Inactive;
    			int x;
    			int y;
    			int Index;
    			int IsActive;
    			void (*Callback) (SDL_Surface * screen, int * done);
    			struct ButtonList * Next;
    		} ButtonList;
    

    Wie gesagt, ich steh aufm schlauch. Hat einer von euch ne idee?



  • Richtig aufrufen musst du die Funktion natürlich auch noch, also etwa in der Form:

    ButtonList *bl=0;
    AddButton(&bl,...)
    

    Debugge doch mal.



  • void AddButton (ButtonList ** Buttons, int x, int y, SDL_Surface * Active, SDL_Surface * Inactive, void (*Callback) (SDL_Surface * screen, int * done)) {
    	ButtonList * Ref;
    	if ((*Buttons) == NULL) {
    		(*Buttons) = malloc (sizeof (ButtonList));
    		(*Buttons)->x = x;
    		(*Buttons)->y = y;
    		(*Buttons)->Active = Active;
    		(*Buttons)->Inactive = Inactive;
    		(*Buttons)->Callback = Callback;
    		(*Buttons)->Index = 0;
    		(*Buttons)->IsActive = 0;
    		(*Buttons)->Next = NULL;
    	} else {
    		Ref = (*Buttons);
    		while (Ref->Next != NULL) { Ref = Ref->Next; }
    		Ref->Next = malloc (sizeof (ButtonList));    // Hier holst du Speicher 
    		Ref->Next->x = x;
    		Ref->Next->y = y;
    		Ref->Next->Active = Active;
    		Ref->Next->Inactive = Inactive;
    		Ref->Next->Callback = Callback;
    		Ref->Next->Index = Ref->Index + 1;
    		Ref->Next->IsActive = 0;
    		Ref->Next = NULL;                            // Und hier sagst du vergiss es      Ref->Next->Next = NULL;
    	}	
    }
    

    Du solltest die Funktion mal aufräumen.
    Du machst in beiden Teilen fast das Gleiche. Das kannst du zusammenfassen. :xmas1:


Anmelden zum Antworten