Autor Thema: "Out Of Stack Space" bei Rekursion  (Gelesen 1979 mal)

Offline kevisback

  • Frischling
  • *
  • Beiträge: 42
"Out Of Stack Space" bei Rekursion
« am: 17.10.05 - 11:43:47 »
Hallo,

hier erstmal mein Code:

Code
Sub costcalc(doc As NotesDocument)
		If Not (doc Is Nothing) Then
		Set dctemp = doc.Responses
		If dctemp.Count > 0 Then 'gehe bis in die letzte Ebene
			
			Set doc = dc.GetNextDocument(doc)
			Call costcalc(doc)
			
		Else
			Call dcresp.Adddocument(doc)
			Set doc = dc.GetNextDocument(doc)
			Call costcalc(doc)
		End If
	End If
End Sub

dc ist die Collection mit allen Dokumenten und dcresp habe ich als "leer" initialisiert.

Ziel des ganzen ist es, alle Antwortdokumente zu bekommen, die keine Antworten selbst mehr haben.

Das funktioniert auch soweit mit vielleicht 50 Dokumenten, aber bei mehr schreit der Compiler immer Out Of Stack Space.

Hat da jemand einen Tipp?


Danke vielmals!!!

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: "Out Of Stack Space" bei Rekursion
« Antwort #1 am: 17.10.05 - 13:16:43 »
Ja, mein Tipp ist, das umzustrukturieren.

Zur Zeit hast du die rekursive Funktion und eine Schleife miteinander verwurstet.

IMHO besser: Du machst eine Schleife, in der du über die DocuemntCollection iterierst und in jedem Durchlauf ermittelst du die "Blätter" des aktuellen Dokuments.

While not doc is nothing

  rekursiveFunktion()

  Set doc = dc.getNextDocument
Loop

Evtl hilft das schon
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: "Out Of Stack Space" bei Rekursion
« Antwort #2 am: 17.10.05 - 15:15:19 »
Hab jetzt keine Zeit darüber nachzudenken, aber für mich sieht dein Ansatz auch ein bischen ungewöhnlich aus.

Eher so:

Dim ebene as Integer ' in declarations als globale Variable
Dim dcAntwortOhneAntworten As NotesDocumentCollection

ebene = 0
dcAntwortOhneAntworten als leere Collections erzeugen (z.B. über db.unprocessedDocuments wenn keine Dokumente in Ansichten angehakt oder ähnliches.

Code
Sub costCalc (col As NotesDocumentCollection) 
  ebene = ebene + 1
set doc = col.getFirstDocument ' hier war ein bug. 
do until doc is Nothing 
if doc.responses.count > 0 then 
   costCalc (doc.responses) 
else 
if ebene > 1 then 
dcAntwortOhneAntworten.addDocument(doc) 
end if 
 Loop
ebene = ebene - 1
end sub 
« Letzte Änderung: 17.10.05 - 21:09:51 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: "Out Of Stack Space" bei Rekursion
« Antwort #3 am: 17.10.05 - 16:52:08 »
Eine Collections mit allen Dokumenten enthält auch eventuell die Antwortdokumente.
Du solltest darauf achten, dass du dieser Funktion eine Collection aller zu berücksichtigen Hauptdokumente übergibst. Könnte klappen.

Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: "Out Of Stack Space" bei Rekursion
« Antwort #4 am: 17.10.05 - 21:09:21 »
Hinweis: colRes verwendet statt den umständlichen Namen.
Code
Sub costCalc (col As NotesDocumentCollection, ebene As Integer)

set doc = col.getFirstDocument ' HIER WAR VORHER EIN BUG
do until doc is Nothing
if doc.responses.count > 0 then
   costCalc (doc.responses, ebene +1)
else
if ebene > 0 then
colRes.addDocument(doc)
end if
Loop

end sub 
Noch besser. Mit den Parametern: (Collection mit allen Hauptdokumenten, 0) aufgerufen. Sollte funktionieren. Ebene hier nicht mehr global deklarieren. Das Ergebnis (dcAntwortOhneAntworten) muß hingegen global bleiben. Könnte man aber vermutlich auch noch lokal machen, wenn man das als Return Wert und Übergabeparameter verwendet.
Code
Function colRes1 (col As NotesDocumentCollection, costCol As NotesDocumentCollection, ebene As Integer) As NotesDocumentCollection

set doc = col.getFirstDocument
do until doc is Nothing
if doc.responses.count > 0 then
   colRes = costCalc (doc.responses, colRes, ebene +1)
else
if ebene > 0 then
colRes.addDocument(doc)
end if
Loop
colRes1 = colRes
end funtion 

Probier bitte mal aus (hab ich nicht gemacht).
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline kevisback

  • Frischling
  • *
  • Beiträge: 42
Re: "Out Of Stack Space" bei Rekursion
« Antwort #5 am: 18.10.05 - 04:19:04 »
Wenn man zuviel programmiert, vor allem rekursiv, dann sieht man den Wald vor lauter Baeumen nicht mehr:

Code
For i = 1 To dc.Count
		If Not (doc Is Nothing) Then
			Set dctemp = doc.Responses
			If dctemp.Count > 0 Then
				Set doc = dc.GetNextDocument(doc)
			Else
				Call dcresp.Adddocument(doc)
				Set doc = dc.GetNextDocument(doc)
			End If
		End If
	Next i


Darauf waere jeder Anfaenger gekommen, aber wir nicht  ;D


Danke fuer eure Hilfe!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz