2017-10-27 2 views
1

Ich schrieb ein einfaches Beispiel, um die Probleme zu lösen, denen ich beim Schreiben seines Programms gegenüberstand.Schalter-Fehler | der Wert von ist nicht in einem konstanten Ausdruck verwendbar

Während der Programmausführung bekomme ich Werte von Eingang1 und Eingang2, wenn ich Werte von Funktionen zurückgebe, die sich dann nie ändern. Etwas später nach verschiedenen Berechnungen im Ablauf des Programms bekomme ich ein Ergebnis, das auch nicht mehr änderbar ist.

Ich versuche, sie mit switch-case zu vergleichen, aber ich bekomme einen Fehler "der Wert von 'input1' ist nicht in einem konstanten Ausdruck verwendbar".

#include <iostream> 

using namespace std; 

char getChar() 
{ 
    char c; 
    cin >> c; 
    return c; 
} 

int main() 
{ 
    // it doesn't work 
    const char input1 = getChar(); 
    const char input2 = getChar(); 

    // it it works 
    //const char input1 = 'R'; 
    //const char input2 = 'X'; 

    char result = getChar(); 
    switch(result) 
    { 
     case input1: 
      cout << "input1" << endl; 
      break; 
     case input2: 
      cout << "input2" << endl; 
      break; 
    } 
    return 0; 
} 

Antwort

1

Sie müssen Ihre Fallanweisungen zur Kompilierzeit wissen. I.e.

switch(result) 
    { 
     case 1: 
      cout << "input1" << endl; 
      break; 
     case 2: 
      cout << "input2" << endl; 
      break; 
    } 

diese Zeilen, während konst nur bedeuten, wirklich schreibgeschützt sind und nicht zum Zeitpunkt der Kompilierung initialisiert.

// it doesn't work 
const char input1 = getChar(); 
const char input2 = getChar(); 

Der Grund, warum die beiden folgenden Zeilen funktionieren würde, weil der Compiler nur substitues in X & R in Ihre switch-Anweisung, bevor Sie den Code selbst

// it it works 
//const char input1 = 'R'; 
//const char input2 = 'X'; 

läuft würde ich vorschlagen, den Switch zu einem ändern, wenn Aussage

if(input1) 
{} 
else if(intput2) 
{} 

Der folgende Code sollte funktionieren:

#include <iostream> 

using namespace std; 

char getChar() 
{ 
    char c; 
    cin >> c; 
    return c; 
} 

int main() 
{ 
    // it doesn't work 
    const char input1 = getChar(); 
    const char input2 = getChar(); 

    // it it works 
    //const char input1 = 'R'; 
    //const char input2 = 'X'; 

    char result = getChar(); 
    if(result == input1){ 
      cout << "input1" << endl; 
    } 
    else if(result == input2){ 
      cout << "input2" << endl; 
    } 

    return 0; 
} 
+0

Danke für die Erklärung! Ich dachte, dass die Verwendung von Wenn-sonst eine gute Option wäre. –

0

Die Etiketten in case Anweisungen verwendet haben, um den Compiler zur Compile-Zeit verfügbar sein, so was Sie versuchen, wird nicht funktionieren.

Sie haben es gemacht const, aber das bedeutet nur, dass es nicht ändert, sobald es initialisiert ist.

0

Das Label case erfordert Somenthin zur Kompilierzeit bekannt. Eine Variable kann in diesem Kontext nicht funktionieren. Sie benötigen eine if... else if... else if..., um eine Switch-Anweisung mit variablen Laufzeitwerten zu imitieren

Verwandte Themen