poistuminen while() lauseesta

Miten while lauseesta pääsee pois noilla samoilla neljällä napilla?

while(1)
{
if(button1==0) ylaraja ;
while(button1==0) ;
XBYTE[LCD2] = ylaraja;

if(button2==0) ylaraja--;
XBYTE[LCD2] = ylaraja;
while(button2==0) ;

if(button3==0) alaraja ;
XBYTE[LCD3] = alaraja;
while(button3==0) ;

if(button4==0) alaraja--;
XBYTE[LCD3] = alaraja;
while(button4==0) ;

}
12968
Äänestä

Muut lukivat myös

Vastaukset 12

Vanhimmat

monellakin tapaa

/* Tapa1: */
while(1)
{
if(jotain) {
tee_jotain();
break;
}

if(jotain_muuta) {
tee_jotain_muuta();
break;
}
}


/* Tapa2: */
done=0
while(!done) {
if(jotain) {
tee_jotain();
done=1;
}

if(jotain_muuta) {
tee_jotain_muuta();
done=1;
}
}

Äänestä

Jos on tarvetta hypätä jossain kohdassa, niin silloin koodissasi on periaatteessa rakenteellinen virhe. Eli haluat periaatteessa hypätä pois while-silmukasta, onnistuu mm. break; komennolla, mutta ei suositeltavaa.

Äänestä
  • Breakin käyttö on täysin yleinen poistumiskeino, oli silmukka sitten mikä tahansa. Toisekseen, se ei missään tapauksessa tarkoita suoraan sitä, että siinä on mitään 'rakenteellisia virheitä'.

    Mitä pitäisi viimeiseen asti c:ssä välttää, on goto.

    Äänestä

  • ... kirjoitti:

    Breakin käyttö on täysin yleinen poistumiskeino, oli silmukka sitten mikä tahansa. Toisekseen, se ei missään tapauksessa tarkoita suoraan sitä, että siinä on mitään 'rakenteellisia virheitä'.

    Mitä pitäisi viimeiseen asti c:ssä välttää, on goto.

    C-kielellä koodatessa ei tarvitse välttää mitään
    kielen omanaisuuksia.

    Äänestä

  • ... kirjoitti:

    Breakin käyttö on täysin yleinen poistumiskeino, oli silmukka sitten mikä tahansa. Toisekseen, se ei missään tapauksessa tarkoita suoraan sitä, että siinä on mitään 'rakenteellisia virheitä'.

    Mitä pitäisi viimeiseen asti c:ssä välttää, on goto.

    Toki se on yleisesti käytetty, mutta se ajaa saman asian kuin goto.. Eli brake on kuin goto, jossa hyppy tapahtuu whilen ulkopuolelle. Toki sitä voi käyttää, mutta sitä ei tarvi, jos koodi on 'oikein' tehty. (Monesti braken käyttö kyllä säätää hermoja ja tupakkaa)

    while(true)
    {
    if(true) goto exit;
    }
    exit:

    Äänestä

  • jopas kirjoitti:

    Toki se on yleisesti käytetty, mutta se ajaa saman asian kuin goto.. Eli brake on kuin goto, jossa hyppy tapahtuu whilen ulkopuolelle. Toki sitä voi käyttää, mutta sitä ei tarvi, jos koodi on 'oikein' tehty. (Monesti braken käyttö kyllä säätää hermoja ja tupakkaa)

    while(true)
    {
    if(true) goto exit;
    }
    exit:

    Noooh ... miten se tulisi tehdä näppärämmin annetun esimerkin tapauksessa? Tai onko se tehokasta jos kelataan KOKO testiketju läpi ilman erillistä käskyä poistua sieltä?

    Äänestä

  • De Smetistä saakka kirjoitti:

    Noooh ... miten se tulisi tehdä näppärämmin annetun esimerkin tapauksessa? Tai onko se tehokasta jos kelataan KOKO testiketju läpi ilman erillistä käskyä poistua sieltä?

    jos haet while silmukkaa, jossa on neljä (poistumis)ehtoa:

    BOOL ehto = True;
    while (ehto)
    {
    switch (jotain)
    {
    case a:
    case b:
    case c:
    case d:
    ehto = False;
    break;
    case e:
    jotain -= 1;
    break;
    default:
    jotain = 1;
    break;
    }
    }

    ja tietysti ihan yhtätehokasta on:
    if (ehto1) {}
    else if (ehto2) {}
    else if (ehto3) {} jne..

    mutta tuosta tulee helposti sekavannäköinen varsinkin kun sitä laajennetaan. Itse pidän tuosta switch case rakenteesta kun eriliaset ehdot aiheuttavat erilaisia toimenpiteitä.

    Äänestä

  • Koodari kirjoitti:

    jos haet while silmukkaa, jossa on neljä (poistumis)ehtoa:

    BOOL ehto = True;
    while (ehto)
    {
    switch (jotain)
    {
    case a:
    case b:
    case c:
    case d:
    ehto = False;
    break;
    case e:
    jotain -= 1;
    break;
    default:
    jotain = 1;
    break;
    }
    }

    ja tietysti ihan yhtätehokasta on:
    if (ehto1) {}
    else if (ehto2) {}
    else if (ehto3) {} jne..

    mutta tuosta tulee helposti sekavannäköinen varsinkin kun sitä laajennetaan. Itse pidän tuosta switch case rakenteesta kun eriliaset ehdot aiheuttavat erilaisia toimenpiteitä.

    Laittamastani viestistä puuttuu hakasulkuja, mutta on muuten ihan ymmärrettävää. Napeilta tulee "keskeytys" joka kasvattaa tai pienentää antureiden(alaraja/yläraja) arvoja. Arvot sitten siirretään näytölle(LCD2/LCD3). Ongelma tosiaan on tuo samoilta napeilla annettava keskeytys(poistuminen silmukasta), joka ei tuottaisi ongelmia rajojen säätöön.

    Äänestä

Idea olisi siis poistua tuosta silmukasta napin painalluksella, esim. pitämällä pitempään pohjassa... Näppäimiä on vain nuo käytössä olevat neljä, enkä haluaisi mitään ylimääräisiä painalluksia/viivettä ylä- ja alarajan säätöön.

Olen nyt lomilla, mutta väkerrän koodia taas alkuviikosta. Eiköhän tuohon joku konsti löydy. Kysyin vain laiskuuttani teiltä vinkkejä.

Äänestä

ikuisia silmukoita ja yleensäkin silmukoita varten on olemassa "break" ja "continue"

Äänestä

Voisit poistua painamalla kahta näppäintä yhtäaikaa eli

.
.
if((button1==0)&&(button2==0))
break;
.
.

Äänestä
  • Ei ole kunnon testiohjelmaa, mutta eikö tämän pitäisi toimia:

    while(ehto==1)
    {
    if(button1==0){
    ylaraja ;
    while(button1==0){
    if((button1==0)&&(button2==0)){
    ylaraja--;
    while((button1==0 || button2==0) || (button1==0 && button2==0)){;}
    ehto=2;
    }
    }
    XBYTE[LCD2] = ylaraja;
    }

    if(button2==0){
    ylaraja--;
    while(button2==0){
    if((button1==0)&&(button2==0)){
    ylaraja ;
    while((button1==0 || button2==0) || (button1==0 && button2==0)){;}
    ehto=3;
    }
    }
    XBYTE[LCD2] = ylaraja;
    }

    if(button3==0){
    alaraja ;
    XBYTE[LCD3] = alaraja;
    while(button3==0);
    }

    if(button4==0){
    alaraja--;
    XBYTE[LCD3] = alaraja;
    while(button4==0) ;
    }

    }

    Äänestä

Kommentoi aloitusta


Tumpelo kirjoitti:

Miten while lauseesta pääsee pois noilla samoilla neljällä napilla?

while(1)
{
if(button1==0) ylaraja ;
while(button1==0) ;
XBYTE[LCD2] = ylaraja;

if(button2==0) ylaraja--;
XBYTE[LCD2] = ylaraja;
while(button2==0) ;

if(button3==0) alaraja ;
XBYTE[LCD3] = alaraja;
while(button3==0) ;

if(button4==0) alaraja--;
XBYTE[LCD3] = alaraja;
while(button4==0) ;

}

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu