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) ;
}
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) ;
}
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;
}
}
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.
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.
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ä?
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.
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ä.
ikuisia silmukoita ja yleensäkin silmukoita varten on olemassa "break" ja "continue"
Voisit poistua painamalla kahta näppäintä yhtäaikaa eli
.
.
if((button1==0)&&(button2==0))
break;
.
.
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) ;
}
}