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.
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.
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.
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.