einfach verkettete listen
-
Hast du denn mal versucht, dein Programm im Debugger zu beobachten?
(bei der Löschfunktion fällt auf jeden Fall auf, daß der Wäscheständer nicht darüber informiert wurde, daß ihm der Speicher gekappt wurde - d.h. bei weiterer Verwendung würdest du mit freigegebenen Daten hantieren)
-
ich hab etliche sachen versucht. manches hat funktioniert. wie z.b. mal die while schleife wegzulassen, aber damit erreiche ich nciht das was ich wollte.
könntest du vielleicht mal den quellcode für "die knoten loeschen" so ändern dass es deiner meinung nach funktionieren müsste? ich weiß nämlich nicht was du mit und ich zitiere:
"(bei der Löschfunktion fällt auf jeden Fall auf, daß der Wäscheständer nicht darüber informiert wurde, daß ihm der Speicher gekappt wurde - d.h. bei weiterer Verwendung würdest du mit freigegebenen Daten hantieren)"meinst. ^^
-
royboy schrieb:
ich hab etliche sachen versucht. manches hat funktioniert. wie z.b. mal die while schleife wegzulassen, aber damit erreiche ich nciht das was ich wollte.
Trial und Error ist für hochwertige Programme selten der richtige Lösungsweg. Schnapp dir deinen Debugger, setz einen Breakpoint auf die erste Zeile der Funktion und dann verfolge Schritt für Schritt was sie macht - und vergleiche es mit dem was sie machen sollte.
könntest du vielleicht mal den quellcode für "die knoten loeschen" so ändern dass es deiner meinung nach funktionieren müsste? ich weiß nämlich nicht was du mit und ich zitiere:
"(bei der Löschfunktion fällt auf jeden Fall auf, daß der Wäscheständer nicht darüber informiert wurde, daß ihm der Speicher gekappt wurde - d.h. bei weiterer Verwendung würdest du mit freigegebenen Daten hantieren)"Am Ende der Funktion fehlt auf jeden Fall ein "stange->pAnfang=NULL;". So wie die Funktion momentan aussieht, gibst du zwar den Speicher der Liste frei, allerdings verweist die Liste weiterhin in diesen freigegebenen Speicherbereich (könnte fatal werden, wenn du danach noch weiterarbeiten willst).
-
CStoll du bist ein Genie
es funktioniert mit deiner Verbesserung. Es tut mir leid. Es macht ja absolut Sinn die Liste auf NULL zu setzen so wie es am anfang der main funktion gemacht wird. Ich habs einfach nicht mehr gesehen. Pardon!
hast du denn auch noch eine idee für die rekursive produkt funktion?
Ich habe eine weitere Funktion implementiert, die ebenfalls nicht funktioniert.
Diese Funktion soll einen bestimmen knoten mit einem bestimmen wert finden und aus der liste entfernen. wenn die liste leer ist oder der wert nicht in der liste zu finden ist soll eine entsprechende fehlermeldung ausgeworfen werden.
meine idee ist folgende:void entnehme_waesche(waeschestaender *stange,int zahl) { struct buegel *ptemp; struct buegel *ploesch; ptemp=stange->pAnfang; if(ptemp==NULL){printf("Stange leer");} else { while (ptemp != NULL) { if(ptemp->nummer==zahl) {ploesch=ptemp; ptemp=ptemp->pNach; free(ploesch);} ptemp=ptemp->pNach; }; if(ptemp==NULL) printf(" Nummer nicht dabei"); }; }
-
royboy schrieb:
CStoll du bist ein Genie
es funktioniert mit deiner Verbesserung. Es tut mir leid. Es macht ja absolut Sinn die Liste auf NULL zu setzen so wie es am anfang der main funktion gemacht wird. Ich habs einfach nicht mehr gesehen. Pardon!
hast du denn auch noch eine idee für die rekursive produkt funktion?
Auf Anhieb sehe ich bei der Funktion keinen Fehler. Deshalb wiederhole ich meinen Tip: Frag deinen Debugger!!!
Ich habe eine weitere Funktion implementiert, die ebenfalls nicht funktioniert.
Diese Funktion soll einen bestimmen knoten mit einem bestimmen wert finden und aus der liste entfernen. wenn die liste leer ist oder der wert nicht in der liste zu finden ist soll eine entsprechende fehlermeldung ausgeworfen werden.
meine idee ist folgende:Wenn du ein Element aus der Liste löschen willst, mußt du den Vorgänger anpassen und dessen Nachfolger-Zeiger korrekt umbiegen.
-
Dein Tipp hat mir wieder weitergeholfen danke.
hier mein neuer quellcode dazu:
void entnehme_waesche(waeschestaender *stange,int zahl) { struct buegel *ptemp; struct buegel *ploesch; ptemp=stange->pAnfang; if(ptemp==NULL){printf("Stange leer");} else { while (ptemp != NULL) { if(ptemp->nummer==zahl) { ploesch->pNach=ptemp->pNach; free(ptemp); ptemp=ploesch->pNach; } else{ ploesch=ptemp; ptemp=ptemp->pNach;} }; //if((ptemp==NULL) //printf(" Nummer nicht dabei"); }; }
Die funktion schmeisst mir jetzt die gesuchte zahl damit raus. Aber dennoch fehlt mir immernoch eine kleinigkeit. Und zwar soll die funktion "nummer nicht dabei" auswerfen wenn die nummer nicht gefunden wurde. so wie ich es hier implementiert habe ist es natürlich falsch. ich weiss nicht wie ich diese "abbruchbedingung" so programmieren könnte.
Blöde Frage: Wo finde ich den debugger bei eclipse?
-
double produktRekursiv(waeschebuegel *ptemp) { if (ptemp == NULL) return 10; return ptemp->nummer * produktRekursiv(ptemp->pNach); }
Ich weiß nicht genau was das Problem dieser Funktion ist. Aber ich weiß dass es mit der if bedingung und der folgenden abbruchbedingung zu tun. er wirft nämlich immer nur das aus was nach dem ersten return steht. in diesem fall 10.
-
Dann wird ptemp NULL sein.
Wenn du den Debugger nicht findest, kannst du auch mit printf Informationen zum debuggen ausgeben.
printf("produktRekursiv: ptemp = %p\n", ptemp);
Entsprechend in den anderen Funktionen.
Speziell in den Schleifen.
Vor und nach Funktionsaufrufen.royboy schrieb:
ich weiss nicht wie ich diese "abbruchbedingung" so programmieren könnte.
Mach doch nach dem free() ein return.
Und nutze den Rückgabewert der Funktion aus. Dann kann die aufrufende Funktion auch mitbekommen das etwas nicht geklappt hat.
Z.B:
return 0; alles ok
return 1; Stange leer
return 2; Zahl nicht gefunden.
...
Eine Funktion wie entnehme_waesche() braucht nicht den User informieren.
-
DirkB schrieb:
Dann wird ptemp NULL sein.
Wenn du den Debugger nicht findest, kannst du auch mit printf Informationen zum debuggen ausgeben.
printf("produktRekursiv: ptemp = %p\n", ptemp);
Entsprechend in den anderen Funktionen.
Speziell in den Schleifen.
Vor und nach Funktionsaufrufen.royboy schrieb:
ich weiss nicht wie ich diese "abbruchbedingung" so programmieren könnte.
Mach doch nach dem free() ein return.
Und nutze den Rückgabewert der Funktion aus. Dann kann die aufrufende Funktion auch mitbekommen das etwas nicht geklappt hat.
Z.B:
return 0; alles ok
return 1; Stange leer
return 2; Zahl nicht gefunden.
...
Eine Funktion wie entnehme_waesche() braucht nicht den User informieren.Hallo Dirk,
ich hab leider weder den ersten noch den zweiten Teil deines beitrags verstanden. also das printf fürs debuggen hat nicht funktioniert oder ich habs falsch verwendet.
zu meiner funktion produktRekursiv verstehe deinen ersten satz nicht. also ich weiß nicht was du mir jetzt als lösung da vorgeschlagen hast.
zu meiner zweiten funktion--> kannst du bitte meinen quellcode so ändern dass es deiner meinung nach funktionieren könnte. oder evtl modifikationsvorschläge per zeilenangaben.
danke
gruss roy
-
Wer benutzt eigentlich freiwillig MinGW in Eclipse?
int entnehme_waesche(waeschestaender *stange,int zahl) { /* return 0; alles ok return 1; Stange leer return 2; Zahl nicht gefunden. */ struct buegel *ptemp; struct buegel *ploesch; ptemp=stange->pAnfang; while (ptemp != NULL) { if(ptemp->nummer==zahl) {ploesch=ptemp; ptemp=ptemp->pNach; free(ploesch);return 0;} ptemp=ptemp->pNach; }; return ptemp==stange->pAnfang?1:2; }
Hiermit trennst du fachlich und technisch nicht zusammengehörende Dinge wie Listenverwaltung und Nutzerausgabe auch im Code voneinander.