Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C:n for-silmukka VB6-syntaksilla?

Sivun loppuun

rautamiekka [25.08.2008 11:52:59]

#

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 ?

Grez [25.08.2008 11:56:23]

#

For i = 1 to 150
 'Loopissa suoritettava koodi tänne
Next

Newb [25.08.2008 11:56:48]

#

For i = 1 to 150 Step 1


Next i

Edit. Grez ehti eka.

rautamiekka [25.08.2008 12:19:48]

#

Onko mitään merkitystä/eroa käytännössä käytänkö Grezin tai Newb:n versioo ?

Gaxx [25.08.2008 12:24:51]

#

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.

Grez [25.08.2008 12:56:00]

#

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.

Gaxx [25.08.2008 21:09:53]

#

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ä.

Antti Laaksonen [25.08.2008 21:27:33]

#

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

Grez [25.08.2008 22:33:03]

#

No, toi on käytännössä sama kuin Next:Next:Next. Eli ei tuokaan ole "pakko", mutta toki hivenen lyhyempi.

Deffi [25.08.2008 23:42:20]

#

Kyl se kamalaa on, jos joku c-koodarikin ratkeaa johonkin vb:hen...

FooBat [25.08.2008 23:56:46]

#

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

Grez [26.08.2008 00:06:57]

#

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

FooBat [26.08.2008 02:55:53]

#

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)

Merri [26.08.2008 13:20:51]

#

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.

Grez [26.08.2008 18:59:29]

#

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)

Gaxx [26.08.2008 19:16:40]

#

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.

Blaze [26.08.2008 19:43:36]

#

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.

Merri [26.08.2008 22:40:56]

#

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ä.

FooBat [26.08.2008 23:43:35]

#

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öä.

Gaxx [27.08.2008 07:50:11]

#

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?

Grez [27.08.2008 12:16:00]

#

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

Schedler [27.08.2008 19:19:23]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta