Domino 9 und frühere Versionen > ND6: Entwicklung

"Out Of Stack Space" bei Rekursion

(1/2) > >>

kevisback:
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

--- Ende Code ---

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!!!

animate:
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

flaite:
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

--- Ende Code ---

flaite:
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

flaite:
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

--- Ende Code ---
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

--- Ende Code ---

Probier bitte mal aus (hab ich nicht gemacht).

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln