Switch-Anweisung mit Variabler Fallzahl



  • Hallo,

    ich Programmiere gerade auf C++, um ein immer gleiches Schema zu automatisieren.
    Dabei bin ich auf das Problem gestoßen, dass ich es nicht schaffe eine Switch-Anweisung zu schreiben, die durchaus eine unterschiedliche Länge haben kann.

    Meine Idee ist folgende:
    ich lege meine Variable "int anz" an, in der die Anzahl der verwendeten Dateien gespeichert ist. Damit erstelle ich ein Array mit den entsprechenden Dateinamen "string skriptname[anz]. Im Anschluss an das anlegen überprüfe ich das nocheinmal und hätte gerne die Möglichkeit die Namen zu ändern. Bisher sieht mein Gedankengerüst so aus:

    ...

    int anz;
    cin >> anz;
    string skriptname [anz];

    int i;

    while (i<anz) {

    string temp_name;
    cin >> temp_name;
    skriptname[i] = temp_name;
    i++

    }

    // Die Ausgabe der Namen mit ID-Nummern steht hier

    cout << "Möchten Sie einen Namen ändern?"
    int temp_number;
    cin >> temp_number;
    cout << endl;

    switch (temp_number) {

    case 1: ...
    case 2: ...

    ...
    case anz-1 : ...

    }

    Kennt ihr eine Möglichkeit soetwas zu realisieren?

    Vielen Dank für die Gedanken und Hilfen die ihr mir gebt!



  • Was hindert dich daran, skriptname[temp_number] = neuer_name; zu schreiben?



  • Das "Switch Statement" ist leider nur für konstante Integer-artige Vergleichsgrößen geeignet. D.h., im Argument von switch steht zwar ne Variable, aber bei den cases stehen nur Konstanten.

    Soll cin eigentlich später redirected werden, so dass man die Eingabe auch aus einer Datei lesen kann? Das würde ja für Automatisierung durchaus Sinn machen.
    Für Tastatureingaben ist cin eher behelfsmäßig zu sehen, weil es zu viele Fehlerquellen bietet.
    Kannst du noch was zum Betriebssystem sagen, unter dem das laufen soll?

    So gehts prinzipiell, ist aber nicht besonders elegant:

    #include <iostream>
    
    using namespace std;
    
    int main(void){
    
    	int anz;
    	cin >> anz;
    	string skriptname [anz];
    
    	int i;
    
    	while (i<anz) {
    
    		string temp_name;
    		cin >> temp_name;
    		skriptname[i] = temp_name;
    		i++;
    
    	}
    
    	// Die Ausgabe der Namen mit ID-Nummern steht hier
    
    	cout << "Möchten Sie einen Namen ändern?";
    	int temp_number;
    	cin >> temp_number;
    	cout << endl;
    
    	if (1 == temp_number){
    
    	}else if (2 == temp_number){
    
    	}else if (2 == temp_number){
    
    	}else if (anz-1 == temp_number){
    	}
    }
    

    Sinnvoller wäre es mit Callbacks zu arbeiten, die man für jeden Fall registriert.
    Also z.B. (schematisch):

    void callbackFnc1(void){}
    void callbackFnc2(void){}
    ...
    
    class script{
    private:
       int maxScriptCount;
       vector<std::string> scriptsNames;
       std::map<int, void(*callb)(void)> callbackMapper;
    public:
       \1::script(void):maxScriptCount(10){};
       int getScriptCount(void);
       int registerScript(int nr, string scriptName, void (*callb)(void));
       int call(int nr){callbackMapper[nr]()};
    }
    

Log in to reply