hoe te begrijpen ?

Status
Niet open voor verdere reacties.

andreaugust

Gebruiker
Lid geworden
7 jan 2012
Berichten
105
Ik maak een programma waarbij ik een verschijnsel zie dat ik niet begrijp en dat in het programma tijd kost.
Het gaat over een recursie sub die een queue gebruikt met enqueue en dequeue en waarbij op een bepaald ogenblik de q.count nul is en ik dan het programma tracht te verlaten met
If q.count = 0 then
exit sub
end if
Het programma treedt wel de if blok binnen maar verlaat niet onmiddellijk het programma.
Het aantal keren dat het terugkeert hangt ongeveer samen met het aantal keren dat het programma aangeroepen wordt.

Ik tracht nu een sterk vereenvoudigd en gewijzigd voorbeeld te geven.

Code:
Private Sub doehetvolgende(ByVal nr As Integer)
    nr = nr - 1
    If nr = 0 Then
      Exit Sub
    End If
    doehetvolgende(nr)
  End Sub

Het programma gaat bij exit sub toch nog eens naar doehetvolgende wat hetzelfde verschijnsel is als bij mijn programma.
Wat is hier aan de hand en kan ik dit tijdverlies (wat wel aardig oploopt bij mijn programma) vermijden.
Dank bij voorbaat
 
Laatst bewerkt door een moderator:
Je kan altijd 'return' proberen maar begrijp de vraag denk ik niet 100%

Hopelijk helpt het toch :)

Mvg,
Matthiee' van MatthiWare
 
hoe te begriijpen

Return doe je toch bij een functie en niet bij een sub.
Bij nader denken geloof ik dat het probleem iets te maken heeft met de stack en bij recurse programma's misschien niet te vermijden is?
 
Nee in vb kan je exit sub gebruiken maar in ander programeer talen bestaat dit niet en moet je return <expressie> gebruiken.

De return statement keert de executie van code terug naar de 'callende' sub, functie, get/set.

Ik heb geprobeerd de code na te maken maar bij mij stopt die als het 0 is.
Je hebt toch de code die niet mag uitgevoerd worden wanneer (uit jouw voorbeeld) nr = 0 erachter gezet?
 
hoe te begrijpen

Wij spreken over Visual Basic Net.
Bij een functie geeft de code Return het einde aan van de functie.
Bv Return 5 beëindigd de functie onmiddellijk en geeft 5 terug.
In mijn eerste vraag heb ik nochtans gezegd dat het over een sub gaat.
Een sub eindigt wanneer de laatste opdracht vervult is of wanneer de opdracht Exit sub gegeven wordt.
 
Je kan ook gewoon 'return' gebruiken zonder expressie erachter probeer het toch maar eens.
 
Je roept een sub aan vanuit een sub waardoor bij het bereiken van nr=0 eerst de laatst aangeroepen sub eruit gaat doormiddel van de exit sub. Daarna de voorlaatste sub omdat de laatste opdracht uitgevoerd is daarna de daarvoor gestartte sub etc etc etc etc etc. (zet maar eens een messagebox die het nummer weergeeft na "doehetvolgende(nr)")

Waarom gebruik je niet een for .. next loop

Code:
Private Sub doehetvolgende(ByVal nr As Integer)
  For i=  nr to 0  step -1
    ...
  Next
End Sub
 
Laatst bewerkt:
hoe te begrijpen

Ellasar, dank voor uw suggestie .
Eerst wil ik zeggen, dat ook volgens wat u zegt de "boosdoener" de stack is ingevolge de recursie.
Maar ik denk dat ik die recursie moet toepassen want het programma na een object ingebracht te hebben brengt nieuwe objecten voort uit een ander programma die op hun beurt terug nieuwe objecten oplevert en die hoeveelheid van objecten is niet constant.
Dus ik zet deze objecten in een queue die vermeerdert en ook vermindert.
Het proces stopt wanneer de queue leeg is (stopt altijd) en dan moet het aantal van die objecten gegeven worden.
Dit aantal zet ik in de aanroep als byref.
Ik vrees dat ik aan die methode gebonden ben.
 
Dan nog steeds is het niet nodig om voor de sub om zichzelf aan te roepen. want het enige wat je daarmee wint is een "queue" van sub's die je genereerd en niet alleen een "queue" van objecten aangezien je hier een potentieel memory leak hebt. geef maar eens doehetvolgende(0) mee.
 
hoe te begrijpen

Ellasar,

Om beter te begrijpen wat u zegt geef ik hier de essentie van de sub weder.
Misschien kunt u wat concreter zijn hiermede.

Public Sub handelcelaf(ByRef mat(,) As Integer, ByVal klr As Integer, ByVal nr As Integer, ByRef hoeveel As Integer)

Dim nr1, nr2, nr3, nr4, iii, jjj As Integer

iii = rijnrscoord(nr, 1)
jjj = rijnrscoord(nr, 2)
geefnieuwenrs(mat, klr, iii, jjj, nr1, nr2, nr3, nr4)

If nr1 > 0 Then
q.enqueue(nr1)
hoeveelheid += 1
End If

If nr2 > 0 Then
q.Enqueue(nr2)
hoeveelheid += 1
End If

If nr3 > 0 Then
q.Enqueue(nr3)
hoeveelheid += 1
End If

If nr4 > 0 Then
q.Enqueue(nr4)
hoeveelheid += 1
End If

If q.Count > 0 Then
handelcelaf(mat, klr, q.Dequeue, hoeveel)
End If

If q.Count = 0 Then
hoeveel = hoeveelheid + 1
Exit Sub
End If

End Sub

Opmerking
1) er worden per keer maximaal 4 nrs afgeleverd <> 0
2) dat ik de hoeveelheid op het einde vermeerder met 1 is m.i. in de contekst van minder belang, het blijkt de juiste beslissing te zijn in het programma.
 
hoe te begrijpen

Ellasar,
Ik ben er in geslaagd zoals u het voorstelde om geen recursie toe te passen en heb er ook een functie van gemaakt terzelfder tijd.
Bedankt voor uw medewerking
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan