C (arduino), while funkar ej, if och goto funkar.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Elias
Inlägg: 48
Blev medlem: 20 januari 2007, 09:45:52
Ort: Alingsås

C (arduino), while funkar ej, if och goto funkar.

Inlägg av Elias »

Hej!

Kort funktions beskrivning:
3 st analoga sensorer s0, s1 & s2.
När s1 är "trigg" lägre än s0 & s2 skall en buzzer pipa, när s1 åker upp till samma nivå som s0 & s2 skall det sluta pipa. Finns även en knapp "b1" som går att använda.

Försöker lösa det men en while loop, funkar inte. en if satts och en goto funkar. Varför?


Kan egentligen inte C är mer en assembler kille men ful kör lite i arduino miljö, hoppas nån kan förklara för mig varför förljande INTE funkar m.a.p. s0,s1 & s2, knappen b1 fungerar som den skall.

Problemet:
Den går in i while loopen men aldrig ut om den är triggad av s1.
Jag har provat att skicka ut s0,s1,s2 på serie monitorn och dom ligger i nivå med varandra när den ligger och vägrar hoppa ur




funkar INTE:

Kod: Markera allt

while ((s1+trigg<s0) &&(s1+trigg<s2) || (digitalRead(b1) == LOW )){

  int s0 = analogRead(A0);
delay(10);
   s0 = analogRead(A0);


  int s1 = analogRead(A1);
delay(10);
   s1 = analogRead(A1);


  int s2 = analogRead(A2);
delay(10);
   s2 = analogRead(A2);//read all analoge values from laser sensors, two reading to get stable results. First reading switches to correct channel, second takes valid reading

 Serial.println(s0);
 Serial.println(s1);
 Serial.println(s2);
 Serial.println("BEEPAAAAA!2 ");
}

MEN följande fungerar, den går in och ur som den skall.
(varför lipar jag då, jag har ju ett sätt att lösa det?
Jag har googlat och fått för mig att goto INTE är best practice i C och så vill jag veta för jag kan inte med min okunniga ögon se varför while loopen inte skulle funka!)


Funkar:

Kod: Markera allt


label:

  int s0 = analogRead(A0);
delay(10);
   s0 = analogRead(A0);


  int s1 = analogRead(A1);
delay(10);
   s1 = analogRead(A1);


  int s2 = analogRead(A2);
delay(10);
   s2 = analogRead(A2);

 Serial.println("BEEPAAAAA!2 ");
if ((s1+trigg<s0) &&(s1+trigg<s2) || (digitalRead(b1) == LOW )) goto label;

Användarvisningsbild
bit96
Inlägg: 2492
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: C (arduino), while funkar ej, if och goto funkar.

Inlägg av bit96 »

Kod: Markera allt

while ((s1+trigg<s0) &&(s1+trigg<s2) || (digitalRead(b1) == LOW )){
Kolla upp prioriteterna!
== har högre prio än && och ||
Använd många parenteser, fler än du tror du behöver. :)

Kod: Markera allt

while ( ( (s1+trigg<s0) &&(s1+trigg<s2) || (digitalRead(b1)  ) == LOW )){
Jag orkar inte läsa all din kod och jag kan inte Arduino, men detta uttryck ser inte korrekt ut.

Alternativt:

Kod: Markera allt

while ( ( (s1+trigg<s0) &&(s1+trigg<s2) ) || (digitalRead(b1)  == LOW )){
Användarvisningsbild
Klas-Kenny
Inlägg: 11339
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: C (arduino), while funkar ej, if och goto funkar.

Inlägg av Klas-Kenny »

Jag ser ett potentiellt problem.

Inuti loopen så deklarerar du s0, s1 och s2 igen (int s0....), vilket du antagligen redan gjort utanför loopen, annars skulle den inte fungera.
Det som händer då är att du får NYA variabler med samma namn, inom just det blocket.

Det är något lite lurigt i C. Du kan skapa många variabler med samma namn, bara de deklareras inom olika block.

Så det som händer är att dina nyinlästa värden lägger sig i de nya variablerna, medan loopen kollar på de gamla variablerna. :)
Du får ju inte glömma att variabelnamnen bara är minnesadresser sedan när programmet väl kompilerats.
Elias
Inlägg: 48
Blev medlem: 20 januari 2007, 09:45:52
Ort: Alingsås

Re: C (arduino), while funkar ej, if och goto funkar.

Inlägg av Elias »

Tack, där var problemet.
Tog bort "int" inuti loopen och nu hoppar den ur som den skall!
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C (arduino), while funkar ej, if och goto funkar.

Inlägg av TomasL »

Ska inte en C-kompilator ge ett felmeddelande, eller i alla fall en varning.
nifelheim
Den första
Inlägg: 2329
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: C (arduino), while funkar ej, if och goto funkar.

Inlägg av nifelheim »

GCC varnar, man måste bara läsa varningarna :-)

Jag testade

warning: 's2' may be used uninitialized in this function

Till och med snålandet med parenteser :

warning: suggest parentheses around && within ||
kodar-holger
EF Sponsor
Inlägg: 920
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: C (arduino), while funkar ej, if och goto funkar.

Inlägg av kodar-holger »

Fast det räcker inte med att ta bort dina re-deklarationer. (int inne i loopen).

I while-fallet testar man på innehållet i s0,s1,s2 innan du kör innehållet i loopen. Alltså är variablerna inte initierade när du kommer dit om det inte görs tidigare i koden.

I goto-fallet testar du innehållet efter du läst vilket är mer rätt.

Men goto är mycket sällan en bra konstruktion. I C finns också en sällan använd do...while som förmodligen vore bättre att använda än goto.
Skriv svar