Silmukka ongelma

Voit pyytää apua ohjelmointiongelmiin täältä.
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Silmukka ongelma

Post by Eräs cb koodaaja »

Miten saan aloitettua ja lopetettua silmukan, kun jokin ehto on tosi.(siis, kun yksi ehto on tosi niin aloitetaan ja kun toinen ehto on tosi niin lopetetaan.)
Jos koitan If lauseilla niin cb valittaa "Can't find missing if"

Kyse on While...Wend silmukasta.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Silmukka ongelma

Post by tuhoojabotti »

Code: Select all

Repeat 
Text 0,0,"press space"
If var=1 Then 
while var=1
Text 0,0,"press enter"
if KeyHit(cbkeyreturn) Then var=0
DrawScreen 
Wend
EndIf 
If KeyHit(cbkeyspace) Then var=1
DrawScreen 
Forever 
jos tajusin oikein...
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

Ei noin, vaan seuraavaan tapaan.(koodi ei vaan toimi)

Code: Select all

If aloita = 1 Then While ehto
koodia...
If lopeta = 1 Then Wend
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: Silmukka ongelma

Post by Valtzu »

Code: Select all

If aloita = 1 Then
    While ehto
        // plaaplaa...
        If lopeta = 0 Then
            koodia...
        EndIf
    Wend
EndIf
En tiedä tarkoititko tuota, mitäs ihmettä haluat tuolla saada aikaan :?:
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Silmukka ongelma

Post by Jonez »

Argh kirjottelen tässä romaania ja aina joku ehtii kirjottaa sinne väliin. Kaks kertaa oon jo painanu "lähetä"... No tässä tulee :)

Tuhoojabotti:
Miksi laittaa erikseen:

If var = 1 Then
While var = 1

Silmukkaa ei ikinä suoriteta jos var <> 1, ja If-lauseke ei ikinä toteudu jos var <> 1. Eli siinä tarkastetaan sama ehto kaksi kertaa peräkkäin.

Ja while - wend-silmukassa käyttäisin komentoa Exit sen sijaan että antaisin muuttujalle 'var' arvon 0, tosin sehän vaihtelee ihan käyttötarkoituksen mukaan. Jos annat muuttujalle arvon 0, silmukka käydään silti vielä yhden kerran läpi, kyse kun on while - wend-silmukasta. Komennolla Exit silmukasta poistutaan välittömästi.
Vertaa:

Code: Select all

While a = 0
    If b = 2 Then a = 1
    b + 1
Wend

Print "Kierroksia " + b
WaitKey

Code: Select all

While a = 0
    If b = 2 Then Exit
    b + 1
Wend

Print "Kierroksia: " + b
WaitKey
Eräs cb koodaaja:
Et voi tehdä noin. Jos aloitat silmukan, on se pakko myös lopettaa jossain vaiheessa, ja tuolla tavalla ei kummatkin ehdot välttämättä toteudu.
Joudut tekemään sen esim. näin:

Code: Select all

//Vaihtoehto 1:
If aloita = 1 Then
    While True
        
        If lopeta Then Exit 
    Wend
EndIf

//Vaihtoehto 2:
While aloita

    If lopeta Then Exit

Wend
Jos nyt ymmärsin oiken sen mitä yritit. Voimme ehkä kertoa paremmin miten asia kannattaa tehdä, jos selität meille mitä yrität tehdä.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

Idea on juuri tuo ja saan sen toimimaan noin. Onkohan mahdollista, että tämä "silmukkaa ei voi aloittaa, jollei sille ole varmaa lopetusta", voitaisiin laskea cb:n bugiksi?
Tein jo "kovalla vaivalla" syntaksin korjauksen(projuna on bf kääntäjä) joka tarkistaa, että silmukalla on varmasti aloitus ja lopetus pisteet(Purkka_kuminauha_jeesusteippi olisi jäänyt vähemmälle, jos sen olisi saanut suoraan toimimaan).

Kiitos vastauksista.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Silmukka ongelma

Post by Jonez »

Onkohan mahdollista, että tämä "silmukkaa ei voi aloittaa, jollei sille ole varmaa lopetusta", voitaisiin laskea cb:n bugiksi?
Se ei todellakaan ole bugi, vaan ihan normaali logiikkavirhe, jonka cb:n kääntäjä tunnistaa ja luonnollisesti heittää erroria, syystä jonka mainitsin edellisessä viestissäni.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

Olisihan se tietysti parempi jos sen voisi kiertää (Tiedän ehkä miten), mutta tiedetään tiedetään, cb on aloittelijoille suunnattu kieli.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Silmukka ongelma

Post by tuhoojabotti »

OFFTOPIC:
Jonez wrote: Tuhoojabotti:
Miksi laittaa erikseen:

If var = 1 Then
While var = 1
joo oon ollu vähän tillin tallin nukuin bout 3 tuntii viime yönä...
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Silmukka ongelma

Post by koodaaja »

Eräs cb koodaaja wrote:Olisihan se tietysti parempi jos sen voisi kiertää (Tiedän ehkä miten), mutta tiedetään tiedetään, cb on aloittelijoille suunnattu kieli.
Siis mielestäsi olisi hyvä ominaisuus, että voisit määritellä loopin, jolle ei koodissa määritellä varmaa loppua? Ja tämän ominaisuus johtuu siitä, että CB on aloittelijoille suunnattu? Yllätys yllätys: vaikkapa C++:ssa tämä on aivan yhtä mahdotonta. Kuten kuvitellakseni kaikissa kielissä. Ja mitä tällä edes saavutettaisiin? Sitä, että koodi suoritettaisiin vain kerran? Voithan laittaa loppuun tarkistuksen "If lopetetaan_ekalla Then Exit", sitten vain laitat tarvittaessa lopetetaan_ekalla -muuttujan arvoksi muun kuin nollan. Ta-daa.
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

Siis mielestäsi olisi hyvä ominaisuus, että voisit määritellä loopin, jolle ei koodissa määritellä varmaa loppua?
Kyllä :!: Juuri minun omassa projektissani(ja ehkä joidenkin muidenkin) olisi tästä hyötyä(ei tarvitse viritellä niin paljoa). Luonnollisesti, jos loopissa ei ole alkua tai loppua, sitä ei suoritettaisi kuin kerran.
Yllätys yllätys: vaikkapa C++:ssa tämä on aivan yhtä mahdotonta. Kuten kuvitellakseni kaikissa kielissä. Ja mitä tällä edes saavutettaisiin? Sitä, että koodi suoritettaisiin vain kerran?
En tarkoittanut siinä mielessä, että C++:lla voisi tehdä näin tuossa kohdassa:"CB on aloittelijoille suunnattu kieli", vaan sitä, että monimutkaisia ominaisuuksia ei ole niin paljon. Ja tuosta esimerkistä:
Voithan laittaa loppuun tarkistuksen "If lopetetaan_ekalla Then Exit", sitten vain laitat tarvittaessa lopetetaan_ekalla -muuttujan arvoksi muun kuin nollan. Ta-daa.
Kyllä minä tuollaisia osaan tehdä(ohjelmointikokemusta n.3-4 vuotta), mutta jos kysyn täällä foorumilla asiallisesti jotain, eikö siihen voisi vastata asiallisesti.

ps. Tämä on minun mielipiteeni asiasta
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Silmukka ongelma

Post by koodaaja »

No mikset sitten tee sellaista vaan yrität jotain kielen logiikan vastaista o: Ja IMHO tuo oli varsin asiallinen vastaus, ainoastaan lopussa oleva ta-daa olisi voinut viitata kettuiluun, mitä se ei edes ollut. Tokihan tuollaisen ominaisuuden voisi kieleen sisällyttää, muttet arvaakaan kuinka moneen virhetilanteeseen moinen johtaisi.
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

En suoraan yritä tehdä logiikan vastaisesti, vaan vain viritellä sen toimimaan. Kyllä minä koodata osaan, mutta virittelyssä en ole kovin hyvä. Ja ymmärsin sen ta-daa -esiimerkkisi v*********, sori. Pystyn arvaamaan, montako virhetilannetta aloittelijat saisivat aikaa(=todella monta, jos komento olisi virheherkkä), mutta "osaavat" koodarit eivät varmasti montaakaan.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Silmukka ongelma

Post by valscion »

Mutta minkä takia tämmöinen pitäisi olla? Looppi joka menee vain kerran läpi? Sehän on sama kuin ei olisi looppia ollenkaan! Alkaa minusta tuntua siltä että olette sekoittaneet termit keskenään, jos If lausekkeesta puhutaan.
Eli siis laitat alkuun sen ehdon, vaikkapa If var <> 1 ja iiihan koodin loppuun sen EndIf, mielummin kuin ei ollenkaan. Onko se nyt muka niin vaikeaa kirjoittaa yksi rivi lisää sinne koodin loppuun? Ei nyt tuota kannata mistään koodaamisesta alkaa hakemaan...

Anteeksi tekstini epäselvyys, pää vähän sekaisin
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

Siis looppia suoritettaisiin, jos molemmat päät löytyisivät. Jos alku tai loppu puuttuisi(tai molemmat) silmukka suoritettaisiin vain kerran. Termejä ei ole sekoitettu, vaan silmukan pitäisi toimia vaikka näin:

Code: Select all

If aloita = 1 Then While ehto
koodia...
If lopeta = 1 Then Wend
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
iTKEVAnAKKI
Advanced Member
Posts: 335
Joined: Tue Aug 28, 2007 3:55 pm
Location: Siellä jossain

Re: Silmukka ongelma

Post by iTKEVAnAKKI »

En ymmärrä mitä ideaa tuossa on:

Code: Select all

Jos aloita=1 niin looppaa jos ehto on tosi
siirretään vaikka objektia
Jos lopeta=1 niin aloita looppi alusta
Eihän tuota edes voi käyttää mihinkään vaikka toimisikin(?).
Projektit:
Joku projekti meneillään... Mitähän siitäkin tulee ;)
TheFish
Developer
Developer
Posts: 477
Joined: Mon Aug 27, 2007 9:28 pm
Location: Joensuu

Re: Silmukka ongelma

Post by TheFish »

miten olisi vain

Code: Select all

alku:
tee jotain
if aloita and lopeta then goto alku
CoolBasic henkilökuntaa
Kehittäjä
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Silmukka ongelma

Post by Harakka »

Tai tuosta kehittelemällä:

Code: Select all

If looppialkaa  = 0 Then goto loopinloppu
loopinalku:
    'tee jotain loopissa
If looppiloppuu = 0 then goto loopinalku
loopinloppu:
EDIT: Aa, ymmärsin idean väärin.
Last edited by Harakka on Sun Jan 06, 2008 3:04 pm, edited 1 time in total.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Silmukka ongelma

Post by koodaaja »

Harakka wrote:Tai tuosta kehittelemällä:

Code: Select all

If looppialkaa  = 0 Then goto loopinloppu
loopinalku:
    'tee jotain loopissa
If looppiloppuu = 0 then goto loopinalku
loopinloppu:
1. Tuo ei ole ollenkaan mitä tarkoitettiin, tuossahan ei käydä koodia lainkaan läpi jos looppialkaa on 0, sehän kuului käydä kerran läpi. ja 2. Gotoa ei kannata käyttää looppeihin, se on hidas ja purkka. Itse tekisin asian näin:

Code: Select all

While looppialkaa
    'loopin sisältö
    If Not looppiloppuu Then Exit
Wend
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: Silmukka ongelma

Post by Eräs cb koodaaja »

Tuossa Harakan esimerkissä ei koodia suoriteta kertaakaan jos looppialkaa - muuttuja on nolla. Ideana siis oli, että jos silmukalle ei ole aloitus- tai lopetuspistettä niin silloin sen sisältö suoritettaisiin vain kerran(mutta suoritettaisiin kuitenkin). Sain itse jo sen toimimaan, mutta joudun kirjoittamaan saman koodin silmukan ulkopuolelle ja sisäpuolelle. Hyöty on siis siinä(omalla kohdallani), kun BF:ää suoritetaan, ja jos koodista löytyy silmukan aloituspiste, voidaan silmukka aloittaa siinä kohtaa ja lopettaa, kun lopetuspiste tulee. Syntaksin korjaus tarkistaa, että koodissa on sekä silmukan aloitus(jos on loppu) ja lopetus(jos on alku) pisteet.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
Post Reply