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

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

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

Inlägg 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.
gkar
Inlägg: 1583
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

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

Inlägg av gkar »

Du kan inte ha villkor i ett case statement. Bara direkta tal, siffror som 42, 4711 eller andra slumptal.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

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

Inlägg av Al_Bundy »

Okej! Då ska jag ta if-statement!
Tackar!

Men skriver jag bara "tangent" utan villkoret så får jag samma error.
gkar
Inlägg: 1583
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

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

Inlägg av gkar »

Det måste vara en konstant. Ingen variabel.
Findecanor
Inlägg: 1044
Blev medlem: 2 juli 2010, 23:04:07

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

Inlägg 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.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

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

Inlägg 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);
  }
Nerre
Inlägg: 27184
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

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

Inlägg 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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

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

Inlägg 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;
}

sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

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

Inlägg av sodjan »

Arduino har ju utmärkta dokumentationssidor.
Gå till http://arduino.cc/
Välj "Reference" från menyn.
Klicka på "switch case".
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

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

Inlägg av johano »

Ja, och eftersom Arduino baseras (bl.a.) på avr-gcc så funkar 'ranges' i case-satserna..

/johan
skalman23
Inlägg: 14
Blev medlem: 29 juli 2014, 10:19:38

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

Inlägg 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?
Skriv svar