Avatar billede spurn Nybegynder
16. september 2002 - 10:11 Der er 25 kommentarer og
1 løsning

Problemer med løkke (VB.NET)

Jeg er vandt til at arbejde med java så der er en ting der irriterer mig.

i java kan man definere en løkkevariabel, men hvis jeg gør følgende i vb, så overlever variablen i og da det er en rekursiv funktion jeg har som skal traversere igennem en træstruktur er det et problem.

hvis jeg siger

for i = 0 to 1000

  i = i + 1

next

så kan jeg få udskrevet 1000 efter løkken er udført, men det jeg vil er at den skal definere en ny instans af i hver gang løkken kaldes hvilket er ret mange gange i den rekursive funktioner, så den ligger en ny instans af i på køretidsstakken og vender tilbage til den pågældende i når et kald er fuldført istedet for at arbejde på den samme i hele tiden

kan det ikke lade sig gøre at definere en løkkevariabel ?
Avatar billede spurn Nybegynder
16. september 2002 - 10:12 #1
altså i skal kun eksistere i løkken og må ikke kunne "fanges" efter.
Avatar billede odegaard Nybegynder
16. september 2002 - 10:15 #2
Slut af med
i=nothing.

Jeg forstår ikke at du kommer ud for dette. Hvis du laver en rekursiv funktion, og kun inde i denne funktion erklærer i, så overlever den kun i denne funktion.
Avatar billede odegaard Nybegynder
16. september 2002 - 10:17 #3
Hvordan erklærer du i ?
Avatar billede spurn Nybegynder
16. september 2002 - 10:22 #4
Sub Rekursiv_Funktion(ByVal parent_node As Int16)

Dim i as Int16
   
For i = 0 to antal_kategorier

  Rekursiv_Funktion(den nye parent node)       

  ' når vi er kommet i en slunode kommer vi tilbage til det forrige kald   
Next

End Sub


Problemet er at når jeg vender tilbage til det forrige kald, er i ikke længere den værdi som den var da jeg forlod den, men istedet er den blevet overskrevet af de kald efter den. Dette er også forståelige da jeg har defineret i længere oppe end løkken. Men jeg ved ikke hvordan jeg gør det i løkken.
Avatar billede kichian Nybegynder
16. september 2002 - 10:25 #5
Jeg vil i forlængelse af odegaards svar også tro, at du erklærer i globalt i dit Object, i stedet for lokalt i funktionen.
I øvrigt er der noget seriøst galt med din løkke. Du tæller selv [i] 1 op. Hvorfor dog det?? Det sket implicit med valget af netop en for-løkke.

Men hvorfor bruger du ikke C# i stedet for VB, da syntaksen i C# ligger tæt op af Java. Fx

for (int i = 0; i < 1000; i++) {
}
Avatar billede z42cool Nybegynder
16. september 2002 - 10:27 #6
Nu er jeg ikke så stærk i VB og jeg forstår ikke hvorfor du vælger VB frem for C# når du kommer fra Java, men det må jo være din sag. Alt andet lige så er det ikke din løkke variabel der er problemet da denne jo netop er erklæret som en lokal variabel og derfor går ud af scope når funktionen slutter.
Avatar billede spurn Nybegynder
16. september 2002 - 10:28 #7
det er lige det jeg er ude for som du siger kichian, men nu skal det her laves i vb.net og så er jeg på skideren. Det eks med i jeg lavede var bare for at skrive noget.
Avatar billede spurn Nybegynder
16. september 2002 - 10:29 #8
når jeg kommer tilbage fra et kald, så er i ikke den værdi den var da jeg kaldte en funktionen igen fra den, men istedet det som den var i kaldet efter.
Avatar billede odegaard Nybegynder
16. september 2002 - 10:44 #9
Og du er sikker på at du ikke erklærer 'i' andre steder, som en global variabel ? (Selvom det slet ikke burde have noget at sige)
Avatar billede kichian Nybegynder
16. september 2002 - 10:50 #10
Din kode ser umiddelbarft rigtig nok ud. Men hvis jeg har forstået din problemstilling korrekt så siger du at

For i = 0 to antal_kategorier
  ' I = x ?
  Rekursiv_Funktion(den nye parent node)       
  ' I != x ?
Next
Avatar billede spurn Nybegynder
16. september 2002 - 11:05 #11
hvis vi siger jeg laver 5 gennemløb

1. nivau = 3 noder

hver af de 3 noder har 2 noder


dvs første gang funktionen kaldes
/**
Rekusiv_Funktion(1. nivaeu)

dvs antal kategorier er nu = 3

For i = 0 to antal_kategorier
  Rekursiv_Funktion(den første kategori)
Next

' da antal kategorier er større end 0 kaldes funktionen nu igen med den første kategori

/**
Rekusiv_Funktion(node1)

dvs antal kategorier er nu = 2

For i = 0 to antal_kategorier
  Rekursiv_Funktion(det første barn)
Next

' da antal kategorier er større end 0 kaldes funktionen nu igen med den første barn

/**
Rekusiv_Funktion(barn)

dvs antal kategorier er nu = 0 da det er et barn som ingen børn har

det betyder at vi ikke kommer ind i for løkken men vender tilbage til sidste kald, dvs den for løkke vi kommer fra

her bliver i talt op med 1 så vi kalder funktionen igen med det 2. barn.

/***

bla bla bla


/**

når begge børn er færdige ryger vi et nivaeu længere op så vi kommer op til de 3 første kategorier, men så kommer problemet.

i skulle nu være 1 hvis det var java, så den tager den anden kategori, men i vb er den nu 2, fordi der var 2 slutknoder i den forrige kategori.

Håber i kan se problemstillingen nu, at jeg ikke kan få defineret en løkkevariabel som ligges på køretidsstakken så den er bevaret til jeg kommer tilbage til kaldet igen.
Avatar billede kichian Nybegynder
16. september 2002 - 11:16 #12
Der er et problem med din løkke betingelse!

<citat>
dvs antal kategorier er nu = 3

For i = 0 to antal_kategorier
  Rekursiv_Funktion(den første kategori)
Next

' da antal kategorier er større end 0 kaldes funktionen nu igen med den første kategori
</citat>

Din løkke skal i virkeligheden skrives :
For i = 0 to antal_kategorier-1
eller
For i = 1 to antal_kategorier
Avatar billede kichian Nybegynder
16. september 2002 - 11:18 #13
Jeg vil tro at :

For i = 1 to antal_kategorier

vil redde din rekursion! Dvs. problemt er ikke køretidsstakken!
Avatar billede spurn Nybegynder
16. september 2002 - 11:23 #14
igen var det bare tænkt eksempel, og fuck jeg er ringe til det. Det centrale er at den ikke gemmer variabeln som den skal fordi den er defineret udenfor og dermed bliver pillet ved hver gang løkken køres og ikke den instans som den bør lave, ligesom c og java gør.
Avatar billede odegaard Nybegynder
16. september 2002 - 11:26 #15
Jeg må nu alligevel give kichian ret i at problemet næppe ligger i din køretidsstak, men i en anden lille åndsvag fejl. Det du siger der sker, burde såmænd ikke ske.
Avatar billede spurn Nybegynder
16. september 2002 - 11:31 #16
Hvis du siger

Dim i as Int16

For i = 0 to 1000
  ' her laver vi intet
Next

Response.Write(i)


så bliver outputtet 1000 istedet for en fejl om i ikke eksistere så jow, fejlen må være at den ikke er defineret som en løkke variabel, jeg skal jo definere den over, da jeg ikke kan finde en syntax til at definere den inden i løkken.
Avatar billede odegaard Nybegynder
16. september 2002 - 11:42 #17
Ja selvfølgelig bliver i=1000 ! Du har jo lige talt den op til 1000. Og selvfølgelig eksisterer 'i' da, når du lige har defineret den. Din response.write() er jo i samme scope som variablen 'i'.

Anyway, jeg har lige leget lidt med at lave en rekursiv funktion, og jeg får ikke samme problem som du siger.

Hvad med at vise os hele din rekursive funktion? Det virker som om du har misforstået noget grundlæggende VB-syntax.

Hvad mener du med løkke-variabel? Det er der så vidt jeg ved ikke noget der hedder her. Din variabel er erklæret i din sub, og så længe den sub lever, så lever variablen også (dvs. indtil du når til End Sub).

Kan det tænkes at det du vil lave, er noget i stil med f.eks. if(int i=0;i++;i<10), hvor 'i' bliver defineret "inde" i for-funktionen.
Avatar billede kichian Nybegynder
16. september 2002 - 11:43 #18
Jeg mener at du fejlfortolker resultatet. At du kan skrive Response.Write(i)
efter løkken, har intet med evt. problemer mht. køretidsstakken at gøre!
Avatar billede odegaard Nybegynder
16. september 2002 - 11:48 #19
Jeg synes egentlig det er meget imponerende at han i det hele taget kan skrive Response.Write() i en .NET applikation, eftersom det er noget man gør i ASP.NET :-)
Avatar billede spurn Nybegynder
16. september 2002 - 11:50 #20
det er asp.net, men scriptsproget er vb.net.

og du skal da ikke kunne gange i uden for løkken det er jo det som er mit problem. Jeg vil gerne have en i som kun eksisterer inde i løkken. Ligesom man kan med java og c#
Avatar billede spurn Nybegynder
16. september 2002 - 11:51 #21
dvs at når jeg bruger response.write så skulle den slet ikke være defineret da den aldrig er blevet sat til noget.
Avatar billede odegaard Nybegynder
16. september 2002 - 11:54 #22
Læs nu hvad jeg skriver: Det kan du ikke! Men det er jo heller ikke noget problem hvis du tænker dig lidt om.

Prøv følgende eksempel (giver ikke så meget mening, men problemet eksisterer ihvertfald ikke):
-----------------------------------------------------------
<script language="VB" runat=server>
Sub Page_load()
    Rekursiv(2,0)
End Sub

Sub Rekursiv(byval node as int16, byval niveau as integer)
    Dim i as int16 = 0
    Dim j as int16 = 0
    For j=0 to niveau
        Response.write("-- ")
    Next
    Response.write("<b>Starting node " & node & " at level " & niveau & "</b><br/>")   
    For i = 0 to node
        For j=0 to niveau
            Response.write("-- ")
        Next
        Response.write(node & ": " & i & " at level " & niveau & "<br/>")
        If not niveau>3 Then
            Rekursiv(i,niveau+1)
        End if
    Next
End Sub
</script>
Avatar billede kichian Nybegynder
16. september 2002 - 11:56 #23
Er det ikke hamrende irrelevant at i kan ses uden for løkken?
Hvis du vil have en fejl ved brug efter løkken, så sæt din løkkevariabel = Nothing efter løkken.
Avatar billede spurn Nybegynder
18. september 2002 - 08:45 #24
Ser ikke ud til at der kan komme en løsning ud af dette, så har istedet valgt at lave det i C#, så i kan hjælpe der istedet :)

http://www.eksperten.dk/spm/259251

hvis i begge opretter et svar får i jeres point for hjælpen.
Avatar billede odegaard Nybegynder
18. september 2002 - 10:38 #25
Jeg kan nu slet ikke se problemet. SKAL det lige være på den måde du har fået i hovedet (som er umulig)?
Du har jo fået adskillige løsninger lagt på bordet.

Blot fordi Java kan oprette en løkke-variabele, så bliver den faktisk oprettet udenfor alligevel. Man kan ikke erklære variabler midt i en funktion. Istedet opretter compileren en variabel med et andet (ubenyttet) navn uden for løkken (i starten af din funktion), som den så benytter i løkken.
Avatar billede spurn Nybegynder
19. september 2002 - 10:01 #26
ikke meget ved at få en løsning som man ikke forstår :/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester