switch case compileert niet en if else wel. Graag uitleg
5 berichten
• Pagina 1 van 1
switch case compileert niet en if else wel. Graag uitleg
Beste mensen,
Ik probeer te begrijpen hoe een struct werkt en hoe ik er gebruik van kan maken.
Hierbij loop ik tegen een, voor mij niet te begrijpen, probleem aan als ik waarden uit de struct in een case switch wil evalueren.
De compiler geeft de foutmelding "the value of 'T1Z' is not usable in a constant expression"
Met een if else heb ik de melding niet en wordt alles gewoon compileert en is de uitvoer goed.
Het gaat om de procedure void Actie(byte Regel)
Ik hoop dat er iemand is die mij in jip en janneke taal kan uitleggen waar dat door komt en vooral hoe ik dat kan omzeilen.
P.S. Het forum heeft een heel andere inspringing dan de ide waardoor de struct hier nogal rommelig uitgelijnd is.
ik maak gebruik van de Arduino:1.8.15 (Windows 10), met Board:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Dit is de code waarbij de case als comment staat en de if else wordt uitgevoerd. Dit compileert gewoon en afhankelijk van het aanroepen van Actie(1); of Actie(2); komt de juiste bijhorende uitvoer
Dit is dezelfde code waarbij if else als comment staat en de case niet.
Ik probeer te begrijpen hoe een struct werkt en hoe ik er gebruik van kan maken.
Hierbij loop ik tegen een, voor mij niet te begrijpen, probleem aan als ik waarden uit de struct in een case switch wil evalueren.
De compiler geeft de foutmelding "the value of 'T1Z' is not usable in a constant expression"
Met een if else heb ik de melding niet en wordt alles gewoon compileert en is de uitvoer goed.
Het gaat om de procedure void Actie(byte Regel)
Ik hoop dat er iemand is die mij in jip en janneke taal kan uitleggen waar dat door komt en vooral hoe ik dat kan omzeilen.
P.S. Het forum heeft een heel andere inspringing dan de ide waardoor de struct hier nogal rommelig uitgelijnd is.
ik maak gebruik van de Arduino:1.8.15 (Windows 10), met Board:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Dit is de code waarbij de case als comment staat en de if else wordt uitgevoerd. Dit compileert gewoon en afhankelijk van het aanroepen van Actie(1); of Actie(2); komt de juiste bijhorende uitvoer
- Code: Alles selecteren
// globale variabelen -----------------------------------------------
byte Begintijd, Relais, PWM , Tijdduur, Soundnr;
// Pin input (sensoren)
byte SLA = 22, // Loods A
SLC = 23, // Loods C
SLD = 25, // Loods D
SK1 = 24, // Kolen loc 1
SK2 = 26, // Kolen loc 2
SF = 28, // Keerpunt loc 2
SWZ1 = 38, // Wissel 1 Zutphen
SWA1 = 39, // Wissel 1 Arnhem
SWZ2 = 40, // Wissel 2 Zutphen
SWA2 = 41, // Wissel 2 Arnhem
SD1 = 42, // Deuren Loods 1
SD2 = 43 // Deuren Loods 2
;
// Pin output (relais)
byte RW1 = 56 , // Wissel 1
RW2 = 57 , // Wissel 2
RD1 = 58 , // Deuren loods 1
RD2 = 59 , // Deuren Loods 2
T1A = 60 , // rijrichting loc 1
T1Z = 61 , // rijrichting loc 1
T2A = 62 , // rijrichting loc 2
T2Z = 63 ; // rijrichting loc 2
// Geluiden, volgorde geluiden op SD
byte Fluit3x = 1,
Ooievaar = 2,
Ameno = 3,
FluitLang = 4,
Water = 5,
Era = 6;
struct Loc // structuur van de array
{ String Tekst;
long Begintijd;
byte Relais;
byte PWM;
int Tijdduur;
byte Soundnr;
};
Loc a0 = {"Tekst ", Begintijd, Relais, PWM , Tijdduur, Soundnr};
Loc a1 = {"Rij L1 Zutphen ", 1100 , T1Z , 100 , 800 , Fluit3x };
Loc a2 = {"Rij L1 Arnhem ", 2000 , T1A , 200 , SLA , Water };
Loc a100 = {"Deuren Loods A ", 2600 , RD1 , HIGH, SD1 , Ooievaar};
Loc a101 = {"Wissel 1 ", 3000 , RW1 , HIGH, SWA1 , Water };
Loc a102 = {"Rijspanning L1 ", 4100 , T1Z , 200 , 800 , Fluit3x };
Loc a103 = {"Deuren loods A ", 2600 , RD1 , HIGH, SD1 , Ooievaar};
Loc a104 = {"Wissel 1 ", 6000 , RW1 , HIGH, SWZ1 , Water };
Loc a105 = {"Deuren loods B ", 6600 , RD2 , HIGH, SD2 , Ooievaar};
Loc Actie_Array[] =
{ a0, a1, a2, a100, a101, a102, a103, a104, a105};
// Programma ========================================================
void loop()
{ Actie(2);
}
void Actie(byte Regel)
{ if (Actie_Array[Regel].Relais == T1Z)
Serial.print ("Zutphen");
else if (Actie_Array[Regel].Relais == T1A)
Serial.print ("Arnhem");
/* switch (Actie_Array[Regel].Relais)
{ case T1Z:
Serial.print ("Zutphen");
break;
case T1A:
Serial.print ("Arnhem");
break;
}*/
}
void setup()
{ Serial.begin(9600);
Serial.print("\n");
for (byte T = 0 ; T <= 5; T++)
{ Serial.print("\n Tekst ");
Serial.print(Actie_Array[T].Tekst);
Serial.print(" begintijd ");
Serial.print(Actie_Array[T].Begintijd);
Serial.print(" Relais ");
Serial.print(Actie_Array[T].Relais);
if ((Actie_Array[T].Tijdduur) < 75)
Serial.print(" Sensor ");
else
Serial.print(" Tijdduur ");
Serial.print(Actie_Array[T].Tijdduur);
Serial.print(" Sound ");
Serial.print(Actie_Array[T].Soundnr);
}
}
// Einde Programma en compile directive ==============================
/*#if !defined(__AVR_ATmega2560__)
#error "Oeps! Zorg ervoor dat 'Arduino Mega' is geselecteerd als board."
#endif
*/
Dit is dezelfde code waarbij if else als comment staat en de case niet.
- Code: Alles selecteren
// globale variabelen -----------------------------------------------
byte Begintijd, Relais, PWM , Tijdduur, Soundnr;
// Pin input (sensoren)
byte SLA = 22, // Loods A
SLC = 23, // Loods C
SLD = 25, // Loods D
SK1 = 24, // Kolen loc 1
SK2 = 26, // Kolen loc 2
SF = 28, // Keerpunt loc 2
SWZ1 = 38, // Wissel 1 Zutphen
SWA1 = 39, // Wissel 1 Arnhem
SWZ2 = 40, // Wissel 2 Zutphen
SWA2 = 41, // Wissel 2 Arnhem
SD1 = 42, // Deuren Loods 1
SD2 = 43 // Deuren Loods 2
;
// Pin output (relais)
byte RW1 = 56 , // Wissel 1
RW2 = 57 , // Wissel 2
RD1 = 58 , // Deuren loods 1
RD2 = 59 , // Deuren Loods 2
T1A = 60 , // rijrichting loc 1
T1Z = 61 , // rijrichting loc 1
T2A = 62 , // rijrichting loc 2
T2Z = 63 ; // rijrichting loc 2
// Geluiden, volgorde geluiden op SD
byte Fluit3x = 1,
Ooievaar = 2,
Ameno = 3,
FluitLang = 4,
Water = 5,
Era = 6;
struct Loc // structuur van de array
{ String Tekst;
long Begintijd;
byte Relais;
byte PWM;
int Tijdduur;
byte Soundnr;
};
Loc a0 = {"Tekst ", Begintijd, Relais, PWM , Tijdduur, Soundnr};
Loc a1 = {"Rij L1 Zutphen ", 1100 , T1Z , 100 , 800 , Fluit3x };
Loc a2 = {"Rij L1 Arnhem ", 2000 , T1A , 200 , SLA , Water };
Loc a100 = {"Deuren Loods A ", 2600 , RD1 , HIGH, SD1 , Ooievaar};
Loc a101 = {"Wissel 1 ", 3000 , RW1 , HIGH, SWA1 , Water };
Loc a102 = {"Rijspanning L1 ", 4100 , T1Z , 200 , 800 , Fluit3x };
Loc a103 = {"Deuren loods A ", 2600 , RD1 , HIGH, SD1 , Ooievaar};
Loc a104 = {"Wissel 1 ", 6000 , RW1 , HIGH, SWZ1 , Water };
Loc a105 = {"Deuren loods B ", 6600 , RD2 , HIGH, SD2 , Ooievaar};
Loc Actie_Array[] =
{ a0, a1, a2, a100, a101, a102, a103, a104, a105};
// Programma ========================================================
void loop()
{ Actie(2);
}
void Actie(byte Regel)
{ /* if (Actie_Array[Regel].Relais == T1Z)
Serial.print ("Zutphen");
else if (Actie_Array[Regel].Relais == T1A)
Serial.print ("Arnhem");
*/
switch (Actie_Array[Regel].Relais)
{ case T1Z:
Serial.print ("Zutphen");
break;
case T1A:
Serial.print ("Arnhem");
break;
}
}
void setup()
{ Serial.begin(9600);
Serial.print("\n");
for (byte T = 0 ; T <= 5; T++)
{ Serial.print("\n Tekst ");
Serial.print(Actie_Array[T].Tekst);
Serial.print(" begintijd ");
Serial.print(Actie_Array[T].Begintijd);
Serial.print(" Relais ");
Serial.print(Actie_Array[T].Relais);
if ((Actie_Array[T].Tijdduur) < 75)
Serial.print(" Sensor ");
else
Serial.print(" Tijdduur ");
Serial.print(Actie_Array[T].Tijdduur);
Serial.print(" Sound ");
Serial.print(Actie_Array[T].Soundnr);
}
}
// Einde Programma en compile directive ==============================
/*#if !defined(__AVR_ATmega2560__)
#error "Oeps! Zorg ervoor dat 'Arduino Mega' is geselecteerd als board."
#endif
*/
Advertisement
Re: switch case compileert niet en if else wel. Graag uitleg
Probeer eens de struct in een const te zetten, ofwel de case werkt alleen als de waarde gewoon een constante is zoals de compiler dus ook vertelt. je bent dus de programma telkens aan het veranderen en dat gaat niet in een case instructie.
paul deelen
shooter@home.nl
shooter@home.nl
Re: switch case compileert niet en if else wel. Graag uitleg
shooter schreef:Probeer eens de struct in een const te zetten, ofwel de case werkt alleen als de waarde gewoon een constante is zoals de compiler dus ook vertelt. je bent dus de programma telkens aan het veranderen en dat gaat niet in een case instructie.
Met andere woorden: In een case kunnen geen variabelen geëvalueerd worden?
Jammer, dan maar meer(dere) array's gebruiken :{
Dank voor je uitleg.
Re: switch case compileert niet en if else wel. Graag uitleg
jawel je kunt de variabele om te switchen wel veranderen maar de structuur van de case kun je niet veranderen. maar je kunt er gewoon const voor zetten. want je verandert ze toch niet in je programma.nou ja eigenlijk hoef je alleen de actie array in een const te zetten.
paul deelen
shooter@home.nl
shooter@home.nl
Re: switch case compileert niet en if else wel. Graag uitleg
shooter schreef:jawel je kunt de variabele om te switchen wel veranderen maar de structuur van de case kun je niet veranderen. maar je kunt er gewoon const voor zetten. want je verandert ze toch niet in je programma.nou ja eigenlijk hoef je alleen de actie array in een const te zetten.
Nogmaals dank voor je uitleg.
Ik ben aan het stoeien gegaan en het blijkt als ik
- Code: Alles selecteren
// Pin output (relais)
// Pin output (relais)
byte RW1 = 56 , // Wissel 1
RW2 = 57 , // Wissel 2
RD1 = 58 , // Deuren loods 1
RD2 = 59 , // Deuren Loods 2
verander in
- Code: Alles selecteren
// Pin output (relais)
const byte
RW1 = 56 , // Wissel 1
RW2 = 57 , // Wissel 2
RD1 = 58 , // Deuren loods 1
RD2 = 59 , // Deuren Loods 2
Dat het vooralsnog wel werkt zoals bedacht. TOP!
5 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten