for (aloitetaan 1:stä; pienempi tai yhtä kuin 150; lisää yksi alotukseen)
Tuossa on C/JScript for-syntaksi, kuka osaa "tulkata" tuon VB6-muotoon kun itse en pääse tuosta pidemmälle ?
For i = 1 to 150 'Loopissa suoritettava koodi tänne Next
For i = 1 to 150 Step 1 Next i
Edit. Grez ehti eka.
Onko mitään merkitystä/eroa käytännössä käytänkö Grezin tai Newb:n versioo ?
Ei ole. Step kertoo vain sen, kuinka paljon muuttujaa kasvatetaan/vähennetään joka kierroksella. Oletuksena se on tuo 1.
Edit: Ja tuo i(muuttujan nimi) nextin perässä tarvitaan vain silloin, jos on useampia silmukoita sisäkkäin.
Ja on putkussa oikein opaskin asiasta.
Ei sitä tarvita vaikka olisikin useampia sisäkkäisiä silmukoita. Jos sen laittaa sinne, niin siitä on lähinnä se hyöty, että kääntäjä/tulkki kertoo virheen jos ne eksyy vahingossa väärään järjestykseen. Eli siis jos laittaa:
For i = 1 To 20 For j = 3 To 10 Next i Next j
niin se sanoo että mitvit? (tarkemmin sanoen "Compile Error: Invalid Next control variable reference")
Ja lisäksi tietysti määrittämällä muuttujan next -lauseesta näkee heti yhdellä silmäyksellä että minkä muuttujan loopista oli kyse. Joskushan näkee esim. C-koodia jossa on:
} // for i loop ends here
Ohjelman toiminnan kannalta siis laittamalla muuttujan next perään ei voi vaikuttaa toimintaan, koska sinne ei voi laittaa mitään muuta kuin sen, joka on oletuksenakin.
Grez kirjoitti:
Ei sitä tarvita vaikka olisikin useampia sisäkkäisiä silmukoita.
Hyvä, että korjasit tiedonpuutteeni. Jokatapauksessa niitä kannattaa käyttää juuri tuon mainitun selkeyden vuoksi — näkee heti, mikä sisäkkäisistä for-loopeista on kyseessä.
Yhdessä tilanteessa on pakko kirjoittaa muuttujia Next-komennon jälkeen: jos haluaa päättää samaan aikaan monta For-silmukkaa.
For a = 1 To 100 For b = 1 To 100 For c = 1 To 100 summa = summa + 1 Next c, b, a
No, toi on käytännössä sama kuin Next:Next:Next. Eli ei tuokaan ole "pakko", mutta toki hivenen lyhyempi.
Kyl se kamalaa on, jos joku c-koodarikin ratkeaa johonkin vb:hen...
Eikös tuota nimettyä Nextiä voi käyttää katkaisemaan sisäsilmukoiden suoritus.
(jotenkin näin, en ole basiciä kirjoitellut sitten C64:n)
For i = 1 To 1000 For j = 1 To 1000 For k = 1 To 1000 If j = k Then Next i End If Next k,j,i
Itse asiassa ei voi. Jossakin tilanteessa se voisi olla kyllä kätevää. Tietääkö joku millä syntaksilla se onnistuisi, itse en ihan suoraa keksi muuta kuin GoTo:n.
Onneksi en keksi syytä ihan tuollaiselle rakenteelle, mutta se täytyisi tehdä jollakin seuraavista tyyleistä. Ehkä luettavin on tuo GoTo:a käyttävä. Vaikka GoToa pidetään pahana, niin sinänsähän Exit For on itsessään Goto Nextin loppuun, samoin kuin esimerkiksi C:ssä break. Tuossa siis Goto on ikäänkuin tupla-Exit For.
Ensimmäinen seuraavista ei ole merkitykseltään ihan sama kuin FooBatin koodi, koska siinä j-silmukasta ulostautuminen voisi tapahtua vaikka k-silmukasta ei ulostauduttaisikaan. Laitoin sen nyt kuitenkin esimerkkinä mukaan.
For i = 1 To 1000 For j = 1 To 1000 For k = 1 To 1000 If j = k Then Exit For Next k If j = k Then Exit For Next j Next i
Dim Ulostaudu_i_asti As Boolean For i = 1 To 1000 Ulostaudu_i_asti = False For j = 1 To 1000 For k = 1 To 1000 If j = k Then Ulostaudu_i_asti = True Exit For End If Next k If Ulostaudu_i_asti Then Exit For Next j Next i
For i = 1 To 1000 For j = 1 To 1000 For k = 1 To 1000 If j = k Then GoTo Next_i Next k Next j Next_i: Next i
No ei voi sitten mitään. Pitänee muistaa tuo seuraavan kerran, kun kirjoitan VB:llä GUI rajapinnan hakkerien IP:n selvittämiseksi.
(http://uk.youtube.com/watch?v=Ni_rAamVP2s)
Ihan vain esimerkkinä, miten sisimmästä luupista voi karata:
For i = 1 To 1000 For j = 1 To 1000 For k = 1 To 1000 If k = 500 Then Exit For Next k If k <= 1000 Then Exit For Next j If j <= 1000 Then Exit For Next i MsgBox k
Jos tuon sisimmän luupin kommentoisi, niin sekä i, j että k olisivat 1001 luuppien päättyessä. Eli kun arvo ei täyty ylitse maksimin, niin tietää että edellinen luuppi on jäänyt kesken.
No joo, ainut vaan että jos taas et haluaisi karata ulommasta loopista vaikka oletkin karannut sisemmästä, niin sitten täytyy itse asettaa se sisimmän loopattava suuremmaksi.
Eli Exit For:lla voi tehdä joko karkaamisen vain yhdestä tai sitten kuvaamallasi tavalla myös seuraavista. Jos haluaa pystyä määrittämään jomman kumman niin tarvitsee käyttää erillistä muuttujaa tai sitten goto-lausetta. (tai pistää joku turha Do-looppi ja käyttää Exit Do jos haluaa näennäisesti välttää gotoa)
Olenkin monesti jäänyt kaipaamaan sellaisia käskyjä kuin Exit For 2 tai break(3); Minusta ne olisivat paljon selkeämpiä, kuin tuollaiset purkkavirityksen näköiset ratkaisut.
Gaxx kirjoitti:
Olenkin monesti jäänyt kaipaamaan sellaisia käskyjä kuin Exit For 2 tai break(3);
PHP:ssä on. En nyt näin äkkiseltään osaa sanoa muita.
Jostain syystä minulla ei ole ollut paljoa tarvetta moiselle. Kaipa se on hieman riippuvainen siitä, miten koodinsa suunnittelee. Esimerkiksi goton tarve on ollut lähellä olematonta. Pari kertaa olen Do Loop -tempun tehnyt, mutta nekään eivät muistaakseni olleet koodissa, jota olisin itse tarvinnut, vaan toisten antamien ehtojen sanelemia. Ylempänä antamaani esimerkkiäkään en ole käyttänyt kovinkaan monesti.
Jos koodin nopeutta ajattelee, niin goto on paras vaihtoehto. Mieluiten goton pitää pomppia mahdollisimman lyhyt matka, tai ohessa pitää olla selkeä kommentti, ihan koodin luettavuuden kannalta. Toisaalta koodin saisi ylipäätään aina kommentoida hyvin, etenkin jos se on muiden silmille tarkoitettua, tai jos meinaa joskus myöhemmin ymmärtääkin sitä kunnolla - olkootkin että koodinlukutaito paranee yleensä ajan myötä.
Javassa on nimetyt continue ja break avainsanat, jotka käytännössä toteuttavat kaikki tapaukset, joissa gotoa yleensä tulee edes harkittua käyttää. Noille on ainakin omissa ohjlemissa löytynyt aika usein käyttöä.
Merri kirjoitti:
Jostain syystä minulla ei ole ollut paljoa tarvetta moiselle.
Harvoinhan noita tilanteita tulee vastaan, mutta aina sen "purkkavirityksen" vääntäminen ärsyttää ja tulee pohdittua hetki, että eikö tätä nyt pysty yhtään fiksummin toteuttaan.
Edit: gotoa en ole tarvinnut sitten puoli vuotta ohjelmoinnin aloittamisen jälkeen. Onko muuten olemassa tilannetta, jossa goto on välttämätön?
Gaxx kirjoitti:
Edit: gotoa en ole tarvinnut sitten puoli vuotta ohjelmoinnin aloittamisen jälkeen. Onko muuten olemassa tilannetta, jossa goto on välttämätön?
Eihän Gotoa, kuten oikeastaan mikään muukaan komento ole välttämätön. Jos on oikein No-Goto-puristi, niin välttää muitakin efektiivisiä Gotoja, kuten juuri Exit For, Exit Do, muissa kielissä break yms.
Ainoa mihin Gotoa oikeastaan voi järjellisesti käyttää on juuri noiden purkkaviritysten välttäminen jos tarvitsee esim. poistua useammasta For-loopista yhdellä kertaa. Tosin enpä kyllä itsekään muista, milloin viimeksi olisi tarvinnut poistua useammasta For-loopista kerralla, ilman että samalla olisi poistuttu esim. Funktiosta (jolloin Exit Function hoitaa homman)
Niin ja tietysti kielissä joissa virheenhallinta hoidetaan joko On Error Resume Next tai On Error Goto xyz komennoilla, on joskus vaikea välttää kokonaan Goton käyttöä. Mutta ei kai kukaan enää moista otsikossakin mainittua antiikkia käytä :D
Gaxx kirjoitti:
Olenkin monesti jäänyt kaipaamaan sellaisia käskyjä kuin Exit For 2 tai break(3); Minusta ne olisivat paljon selkeämpiä, kuin tuollaiset purkkavirityksen näköiset ratkaisut.
Adassa löytyy vastaava, joskin havainnollisempana:
Outer_Loop: for I in My_Array'range loop Inner_Loop: for J in -10..10 loop -- jotain tehdään exit Inner_Loop when Number_Found > 100; end loop Inner_Loop; end loop Outer_Loop;
Luuppeja ei ole tosin pakko nimetä, mutta auttaa usein koodin lukemisessa. Etenkin sisäkkäisten looppien tapauksessa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.