Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Rekursive Prozedur
mars - Sa 08.03.03 15:59
Titel: Rekursive Prozedur
Also, ich hab ein vertrickt-vertracktes Programm geschrieben, das mir den Speicher auffrisst. Und zwar ist es folgendermassen: Ich brauchte eine Funktion, die mir alle möglichen Kombinationen von n Objekten durchprobiert (und zwar auch 3er-, 4er-...ner-Kombinationen).
Jedenfalls dachte ich, die Lösung sei eine rekursive Prozedur, welche alle Möglichkeiten durchspielen sollte. Dies tut sie auch, das Problem ist nur, dass ich jedes Mal beim Prozedur-Aufruf eine neue TObjectList erstellen muss (darin sind die Objekte gespeichert), denn die alte darf nicht verändert werden. Und das gibt natürlich mit der Zeit einen "Out Of Memory" - Fehler.
Auch wenn es ein etwas komisches Problem ist...Hat jemand irgend einen Tipp?
Gausi - Sa 08.03.03 16:31
Brauchst du denn die TObjektlist nach beenden der Prozedur noch? Wenn nicht: Speicher wieder freigeben. Wenn doch: in eine Datei speichern und Speicher freigeben (Vorraussetzung: auf der Platte ist genug Platz).
Oder ist die Rekursionstiefe auch so riesig, dass das freigeben nach dem Rückschritt zur vorigen Rekursionsstufe auch nix bringt?
mars - Sa 08.03.03 23:40
Danke für die Antwort...Ich denke, die TObjectList wird automatisch freigegeben, wenn die Prozedur beendet ist und solange brauche ich sie ja...
Delete - So 09.03.03 04:44
Alles, was du selber erstellst / erzeugst mußt du auch wieder selber freigeben.
Gausi - So 09.03.03 09:31
genau, der Auffassung war ich bisher auch immer, auch wenn ich mich nicht immer dran halte :roll:
Aber es gibt noch ne Möglichkeit. Ich denke mal, n ist bei dir nicht zu groß. Und da du alle Kombinationen durchprobieren willst, sollte die Rekursionstiefe auch höchstens n sein. Das heisst, du brauchst eigentlich nur n verschiedenen TObjectlisten.
Erstell dir dann doch ein Array of TObjectlist der Länge n. (Das natürlich global, nicht lokal in der Procedur)
Welche list du gerade bearbeiten kannst, hängt von der jeweilige Rekursionstufe ab, in der du grade bist. Die kannst du einfach mitspeichern mit
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure rekursiv; begin ... inc(tiefenzaehler); rekursiv; dec(tiefenzaehler); ... end; |
Wenn es damit immer noch zu Speicherproblemen kommt, dann liegt der Fehler ganz wo anders. Zum Beispiel, wenn du in der rek. Prozedur auch Objekte für die Liste erstellst: Die Liste mag ja meinetwegen weg sein, aber die Objekte bleiben auf jeden Fall (sonst würde MEIN aktuelles Projekt nicht klappen :wink: )
mars - So 09.03.03 18:56
Ich werde mir das mit dem Freigeben noch mal ankucken, aber zur Tiefe n: Du hast recht, n ist nicht sehr gross (hab ja nur eine langsame Maschine hier :wink: ), aber es gibt tatsächlich mehr als n TObjektlisten gleichzeitig, denn...das ist kompliziert zu erklären...ähm...
Ich werd jetzt erstmal ausprobieren, obs mit dem Freigeben besser klappt und wenn nicht, versuch ichs doch noch zu erklären.
Danke jedenfalls für eure Mühe!
mars - So 09.03.03 19:44
Nun, es hat tatsächlich geklappt..danke!
Ich sehe nun aber auch, dass es schon ziemlich viele Kombinationen gibt...Mein Rechner ist seit einer halben Stunde am Rechnen :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!