Sida 1 av 1

C: error: ‘tangent’ cannot appear in a constant-expression

Postat: 10 mars 2014, 23:11:18
av Al_Bundy

Kod: Markera allt

Int tangent = 1023;


 while(tangent > 1015)
  {
    tangent = analogRead(A5);
  }
  
  
  switch (tangent)
  {
  case (tangent > 1004 && tangent < 1010):
    tone(5, 400, 400);
    break;
  default:
    break:
  }
Meddelande:
Regulator_kod.ino: In function ‘void setup()’:
Regulator_kod:78: error: ‘tangent’ cannot appear in a constant-expression
Regulator_kod:78: error: ‘tangent’ cannot appear in a constant-expression
Regulator_kod:82: error: expected ‘;’ before ‘:’ token
Regulator_kod:82: error: expected primary-expression before ‘:’ token
Regulator_kod:82: error: expected `;' before ‘:’ token
Vilken rad den syftar på
case (tangent > 1004 && tangent < 1010):
Jag förstår inte. Varför blir det så här? Är det här inte helt självklart?
Det är bara ett kort exempel jag vill köra.
Jag programmerar i C i Arduino.

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 10 mars 2014, 23:19:46
av gkar
Du kan inte ha villkor i ett case statement. Bara direkta tal, siffror som 42, 4711 eller andra slumptal.

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 10 mars 2014, 23:21:01
av Al_Bundy
Okej! Då ska jag ta if-statement!
Tackar!

Men skriver jag bara "tangent" utan villkoret så får jag samma error.

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 10 mars 2014, 23:29:32
av gkar
Det måste vara en konstant. Ingen variabel.

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 10 mars 2014, 23:33:05
av Findecanor
I varje case-sats så kan du bara ha ett konstant uttryck, och "tangent" är en variabel. Endast switch() can ha ett variabelt uttryck.
Kompilatorer brukar ofta kompilera switch-case-satser till uppslagningar i tabeller och dessa tabeller kan inte ändra på sig.

En sak som man ofta kan göra är att göra om värdet i switch-satsen till något som är lättare att välja ur.
T.ex. om du ha flera intervall att välja mellan, och de är lika antal steg långa, så kan du dela med antal steg i intervallerna i uttrycket i switch-satsen. Tänk bara på att division ibland tar många cykler på mikrocontrollers, men delar du med en konstant som är en potens av två brukar prestanda inte vara något problem.

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 11 mars 2014, 00:16:17
av Al_Bundy
Hur skulle ni göra en Switch-case-statement om koden skulle fungera så här:

Kod: Markera allt

 while(tangent > 1015)
  {
    tangent = analogRead(A5);
  }
  
  
  if (tangent > 1005 && tangent < 1011)
  {
    tone(5, 400, 400);
  }
  else if (tangent > 997 && tangent < 1004)
  {
    tone(5, 1000, 400);
  }
  else
  {
    tone(5, 2000, 40000);
  }

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 11 mars 2014, 07:34:55
av Nerre
Det går (såvitt jag förstår) inte att använda switch för den typen av jämförelse du vill göra.

Argumenten till case måste såvitt jag förstått vara ett heltal.

OM du har fixat motstånden så att dina värden är jämnt fördelade så skulle du kunna dividera tangent med en konstant och då i princip få fram numret på tangenten direkt.

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 11 mars 2014, 07:40:20
av johano
Om tangent är en integer kan du ju göra såhär, men det är lite fult IMO:

Men, varför vill du ha en switch, i detta fallet så är ju din if/else-kod väldigt tydlig och klar.

Kod: Markera allt

switch(tangent)
{
   case 1006:
   case 1006:
   case 1007:
   case 1008
   case 1009:
   case 1010:
     tone(5, 400, 400);
     break;

   case 998:
   case 999:
   case 1000:
   case 1001
   case 1002:
   case 1003:
     tone(5, 1000, 400);
     break;

    default:
      tone(5, 2000, 40000);
}
Edit:
GCC har en extension till C som tillåter ranges i case-satserna.

Kod: Markera allt


switch(tangent)
{
   case 1006 ... 1010:
       break;

   case 998 ... 1003:
       break;
}


Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 11 mars 2014, 11:25:34
av sodjan
Arduino har ju utmärkta dokumentationssidor.
Gå till http://arduino.cc/
Välj "Reference" från menyn.
Klicka på "switch case".

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 11 mars 2014, 11:35:32
av johano
Ja, och eftersom Arduino baseras (bl.a.) på avr-gcc så funkar 'ranges' i case-satserna..

/johan

Re: C: error: ‘tangent’ cannot appear in a constant-expressi

Postat: 29 juli 2014, 11:52:33
av skalman23
Al_Bundy skrev:Hur skulle ni göra en Switch-case-statement om koden skulle fungera så här:
Din if-sats blir ju mycket mer lättläst än en Switch-sats. Varför göra om den?