switch case compileert niet en if else wel. Graag uitleg

algemene C code
Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

switch case compileert niet en if else wel. Graag uitleg

Berichtdoor Frits1956 » 30 Sep 2021, 09:30

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

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: switch case compileert niet en if else wel. Graag uitleg

Berichtdoor shooter » 01 Okt 2021, 10:04

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

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: switch case compileert niet en if else wel. Graag uitleg

Berichtdoor Frits1956 » 01 Okt 2021, 15:00

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.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: switch case compileert niet en if else wel. Graag uitleg

Berichtdoor shooter » 01 Okt 2021, 20:02

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

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: switch case compileert niet en if else wel. Graag uitleg

Berichtdoor Frits1956 » 01 Okt 2021, 20:40

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!

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten