Datensatz von einem Bereich in einen anderen einfügen



  • Die Aufgabenstellung:
    Programmieren Sie eine Software, die es ermöglicht verschieden Funktionen eines Autoschiebedachs (Öffnen/Schliessen über Bedienschalter/Fernbedienung, Auswahl im Batteriesensor ob Batteriespannung unter 10 Volt liegt, Fehlerspeicher usw.) simuliert.
    Ich habe bis jetzt alles hingekriegt, d.h. das Hauptmenü, die einzelnen Menüs mit den Simulationen des Öffnungs - und Schließvorgangs und die Auswahl ob die Batteriespannung unter 10 Volt liegt.
    Ich bräuchte Hilfe dabei, wie ich das hinkriegen kann, dass wenn man auswählt, dass die Batteriespannung unter 10 Volt liegt, dieser Fehler in den Fehlerspeicher eingetragen wird. Am besten noch mit der Systemuhrzeit.
    Also es soll im Fehlerspeicher angezeigt werden, dass >10 Volt simuliert wurde.

    Ich hoffe ihr könnt mir helfen! Danke 🙂



  • ...



  • Verstehe nicht, wo das Problem ist. Wenn du einen Fehler in den Fehlerspeicher schreiben sollst, heisst das eben konkret, dass du einen Fehler an einen vector/ein array von Fehlern anhängst. Das wars auch schon.



  • Das muss ja dann so ablaufen dass sobald "Batterie unter 10 Volt" simuliert wird, ein Eintrag in den Fehlerspeicher gemacht wird, der danach angeschaut werden kann.
    Wüsste nicht wie ich das mit dem Code dazu machen soll. Und wie kann ich die Uhrzeit hinzufügen? also der code dafür.



  • Fehlerspeicher ist kein gängiger Begriff.
    Zeig mal was Du bisher an Code verbrochen hast.

    So kann Dir niemand helfen.



  • Wie ist es denn, wenn Dein Fehlerspeicher einfach ein Container mit Fehlermeldungen ist?
    Das ist einfach, und Du kannst schon eine Menge C++, wenn Du vector und string kennst/lernst:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using failure = std::string;
    using failure_memory = std::vector<failure>;
    
    void menu(){
    	std::cout << 
    	"0: Fehlerspeicher ausgeben\n"
    	"1: Batteriespannung absenken\n"
    	"2: Schiebemechanismus blockieren\n";
    }
    
    void print(const failure_memory& mem){
    	if(mem.empty())
    		std::cout << "Keine Fehler.\n";
    	else{
    		std::cout << "Fehler:\n";
    		for(const auto& f : mem)
    			std::cout << f << '\n';
    	}
    }
    
    int main(){
    	failure_memory failures;
    	int c=0;
    	menu();
    	while(c!=-1 && std::cin>>c){
    		switch(c){
    		default:
    			c=-1; 
    			break;
    		case 0:
    			print(failures);
    			break;
    		case 1:
    			failures.push_back("Spannung < 10V");
    			break;
    		case 2:
    			failures.push_back("Schiebemechanismus blockiert");
    			break;
    		}
    	}
    }
    


  • Das ist der Code für die Batterie und den Fehlerspeicher im Diagnosemodus:

    void Menu5()
    {
    	SetConsoleTitle(L"PelloTec - Batteriesensor");
    	system("cls");
    	gotoxy(0,1);
    	cout<<"Sie haben den Batteriesensor ausgew\x84hlt."<<endl;
    	cout<<"\nSie k\x94 \bnnen hier eine Unterspannung der Batterie simulieren."<<endl;
    	cout<<"\nBitte w\x84 \bhlen Sie die zu simulierende Aktion: "<<endl;
    	cout<<"\n1. Batteriespannung ist seit \x81 \bber 30 Sekunden unter 10 Volt"<<endl;
    	cout<<"\n2. Batteriespannung ist unter 5 Volt"<<endl;
    	cout<<"\n3. Zur\x81 \bck ins Hauptmen\x81 \b"<<endl;
    	char nmbr3;
    	cout<<"\nBitte geben Sie die Zahl f\x81r die folgende Aktion ein: ";
    	cin >> nmbr3;
    	switch (nmbr3)
    	{
    	case ('1'):
    		cout<<"\nDie Batteriespannung ist seit \x81 \bber 30 Sekunden lang unter 10 Volt.\nDas Schiebedach wird automatisch geschlossen!";
    			int m_zahl;
    		for(m_zahl =10; m_zahl >=0; m_zahl--)
    		{
    			printf("\n%d \n ",m_zahl);
    			Sleep (1000);
    		}
    		cout<<"\nDieser Schliessvorgang wurde im Fehlerspeicher eingetragen!";
    		std::cout<<
    			"0: Fehlerspeicher ausgeben\n"
    			"1: Batteriespannung absenken\n"
    			"2: Schiebemechanismus blockieren\n";
    		cout<<"\n(Dr\x81 \bcken Sie eine beliebige Taste, um in das Hauptmen\x81 \b zu gelangen!)";
    		break;
    	case ('2'):
    		cout<<"\nDie Batteriespannung ist unter 5 Volt.\nDas Schiebedach muss per Notbet\x84 \btigung manuell geschlossen werden!";
    		cout<<"\n(Dr\x81 \bcken Sie eine beliebige Taste, um in das Hauptmen\x81 \b zu gelangen!)";
    		break;
    	case ('3'):
    		system("cls");
    		return (void (main));
    		break;
    	default:
    		cout<<"\nUng\x81 \bltige Eingabe! Bitte versuchen sie es erneut!";
    		break;
    	}
    	getch();
    	system("cls");
    
    }
    
    void Menu6()
    {
    	SetConsoleTitle(L"PelloTec - Diagnosemodus");
    	system("cls");
    	gotoxy(0,1);
    	cout<<"Sie haben den Diagnosemodus ausgew\x84hlt"<<endl;
    	cout<<"\nHier k\x94 \bnnen Sie alle Bet\x84 \btigungsvorg\x84 \bnge des Schiebedachs \n\x81 \bber den Diagnosetester simulieren!"<<endl;
    	cout<<"\n(F)ehlerspeicher"<<endl;
    	unsigned char nmbr4;
    	cout<<"\nBitte geben Sie die Zahl f\x81 \br die folgende Aktion ein \noder 'f', um in den Fehlerspeicher zu gelangen: ";
    	cin >> nmbr4;
    	switch (nmbr4)
    	{
    	case 'F':
    	case 'f':
    		system("cls");
    		SetConsoleTitle(L"PelloTec - Fehlerspeicher");
    		cout<<"Sie sind nun im Fehlerspeicher."<<endl;
    		cout<<"\nHier werden alle automatischen Schliessvorg\x84 \bnge aufgelistet."<<endl;
    		break;	
    	default:
    		cout<<"\nUng\x81 \bltige Eingabe! Bitte versuchen Sie es erneut!";
    		break;
    	}
    	getch();
    	system("cls");
    }
    

    Im Batteriemodus wird ausgewählt "unter 10 Volt" und dann soll im Diagnosemodus im Fehlerspeicher erscheinen:" Batterie war unter 10 Volt(Unterspannung)"



  • Der Code ist eigentlich ohne

    std::cout<<
    			"0: Fehlerspeicher ausgeben\n"
    			"1: Batteriespannung absenken\n"
    			"2: Schiebemechanismus blockieren\n";
    

    einfach ausblenden 😃



  • Habs nur überflogen - ein paar Kommentare im Quelltext

    for(m_zahl =10; m_zahl >=0; m_zahl--)
            {
                printf("\n%d \n ",m_zahl);  // warum hier printf?
                Sleep (1000);
            }
            cout<<"\nDieser Schliessvorgang wurde im Fehlerspeicher eingetragen!";
            std::cout<<
                "0: Fehlerspeicher ausgeben\n"
                "1: Batteriespannung absenken\n"
                "2: Schiebemechanismus blockieren\n";
            cout<<"\n(Dr\x81 \bcken Sie eine beliebige Taste, um in das Hauptmen\x81 \b zu gelangen!)";
            break;
        case ('2'):
            cout<<"\nDie Batteriespannung ist unter 5 Volt.\nDas Schiebedach muss per Notbet\x84 \btigung manuell geschlossen werden!";
            cout<<"\n(Dr\x81 \bcken Sie eine beliebige Taste, um in das Hauptmen\x81 \b zu gelangen!)";
            break;
        case ('3'):
            system("cls");
            return (void (main));  // ???
            break;  // wann wird diese Zeile abgearbietet?
        default:
            cout<<"\nUng\x81 \bltige Eingabe! Bitte versuchen sie es erneut!";
            break;
        }
        getch();
        system("cls");
    
    }
    
    void Menu6()
    {
        SetConsoleTitle(L"PelloTec - Diagnosemodus"); // Welches Entwicklungstool?
        system("cls");
        gotoxy(0,1);
        cout<<"Sie haben den Diagnosemodus ausgew\x84hlt"<<endl;
        cout<<"\nHier k\x94 \bnnen Sie alle Bet\x84 \btigungsvorg\x84 \bnge des Schiebedachs \n\x81 \bber den Diagnosetester simulieren!"<<endl;
        cout<<"\n(F)ehlerspeicher"<<endl;
        unsigned char nmbr4;
        cout<<"\nBitte geben Sie die Zahl f\x81 \br die folgende Aktion ein \noder 'f', um in den Fehlerspeicher zu gelangen: ";
        cin >> nmbr4;
        switch (nmbr4)
        {
        case 'F':
        case 'f':
            system("cls");
            SetConsoleTitle(L"PelloTec - Fehlerspeicher");
            cout<<"Sie sind nun im Fehlerspeicher."<<endl;
            cout<<"\nHier werden alle automatischen Schliessvorg\x84 \bnge aufgelistet."<<endl;
            break; 
        default:
            cout<<"\nUng\x81 \bltige Eingabe! Bitte versuchen Sie es erneut!";
            break;
        }
        getch();
        system("cls");
    }
    

    ä, ö, ü müsst ihr die so setzen? Ist ja eine sprachliche Besonderheit - soll das Auto nur in einer begrenzten Region verkauft werden? Der Quelltext ist so auch ein wenig stockend zu lesen. 😉

    Die Frage nach dem Entwicklungstool - was bietet es? Müssen da wirklich so viel system("cls") oder bietet das Entwicklungstool da eine elegantere Lösung?



  • Ist Deine Frage: "Datensatz von einem Bereich in einen anderen einfügen" damit erledigt?
    Ich bezweifle das...
    Bisher versteht nämlich niemand, was die Frage ist.



  • Bisher versteht nämlich niemand, was die Frage ist.

    hmlich schreibt man mit h, meine Güte bist du dähmlich.



  • Im Grunde ist es ja egal ob man printf oder cout<< benutzt oder?
    Das ganze ist ein Projekt für die Uni. Als Entwicklungstool benutzen wir Visual Studio 2012.
    Ich wüsste nicht wie ich den Beitrag sonst nennen sollte.
    Mein Problem ist einfach nur dass sobald ">10 Volt" gewählt wird, automatisch ein Eintrag im Fehlerspeicher-Menü entsteht.



  • also von 'void Menu5()' nach 'void Menu6()' sozusagen.



  • ...



  • Aha Universität.

    Wie ich Dich verstehe ist Dein Problem, dass Du nicht weisst, wie Du einen einzigen "Fehlerspeicher" an verschiedenen Stellen im Programm nutzen kannst.
    Am einfachsten reichst Du den Fehlerspeicher dazu im Programm als Funktionsargument herum.

    Ich habe hier noch mal eine leicht abgewandelte Form meines Codes:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using failure = std::string;
    using failure_memory = std::vector<failure>;
    
    void add_blocking_failure(failure_memory& mem){
      mem.push_back("Schiebemechanismus blockiert");
    }
    
    void add_current_failure(failure_memory& mem){
      mem.push_back("Spannung < 10V");
    }
    
    void print(const failure_memory& mem){
      if(mem.empty())
        std::cout << "Keine Fehler.\n";
      else{
        std::cout << "Fehler:\n";
        for(const auto& f : mem)
          std::cout << f << '\n';
      }
    }
    
    void menu(){
      std::cout <<
        "0: Fehlerspeicher ausgeben\n"
        "1: Batteriespannung absenken\n"
        "2: Schiebemechanismus blockieren\n";
    }
    
    int main(){
      failure_memory failures;
      int c=0;
      menu();
      while(c!=-1 && std::cin>>c){
        switch(c){
        default:
          c=-1;
          break;
        case 0:
          print(failures);
          break;
        case 1:
          add_current_failure(failures);
          break;
        case 2:
          add_blocking_failure(failures);
          break;
        }
      }
    }
    

    Oben bestimme ich erstmal, was mein Fehlerspeicher ist (Z. 5 und 6): ein vector von failures , wobei failures einfache string s sind.
    Im Hauptprogramm erstelle ich in Z. 34 einen Fehlerspeicher.
    Es gibt dann drei Funktionen, die mit einem Fehlerspeicher arbeiten zwei add_*_failure() und eine print() Funktion.
    Alle drei werden im Hauptprogramm aufgerufen und als Funktionsargument gebe ich immer den einen Fehlerspeicher mit, den ich in Z. 34 erstellt habe, d.h. alle drei Funktionen arbeiten mit ein und demselben Speicher.

    Funktionen solltest Du eigentlich schon kennen, eine Referenz für std::vector und std::string findest Du hier: http://en.cppreference.com/w/

    Klar?

    Eins noch: hampel nicht soviel mit der Ausgabe rum. Umlaute und Gedoens sind nice to have, lenken aber vom Wesentlichen ab.



  • zuerst mal dankeschön 🙂
    aber ich bekomme beim debuggen die fehlernachricht

    Fehler	20	error C2065: 'failure': nichtdeklarierter Bezeichner
    


  • Dein Compiler nutzt offenbar kein C++11.
    Schreib typedef std::string failure oder aktiviere C++11 Support.


  • Mod

    radddyo schrieb:

    Im Grunde ist es ja egal ob man printf oder cout<< benutzt oder?

    Nein!



  • Durch das typedef bekomme ich jetzt nur noch 7 Fehler:

    Fehler	1	error C2143: Syntaxfehler: Es fehlt ';' vor '='	
    Fehler	5	error C2143: Syntaxfehler: Es fehlt ';' vor '='	
    Fehler	4	error C2226: Syntaxfehler: Typ 'std::string' nicht erwartet	c:\users\radyabo\documents\visual studio 
    Fehler	3	error C2513: 'int': Keine Variable vor '=' deklariert	
    Fehler	7	error C2513: 'int': Keine Variable vor '=' deklariert	
    Fehler	2	error C2868: 'failure': Unzulässige Syntax für using-Deklaration; vollständiger Name erwartet	Fehler	6	error C2868: 'failure_memory': Unzulässige Syntax für using-Deklaration; vollständiger Name erwartet
    


  • Das using brauchste dann mit typedef nicht mehr!


Anmelden zum Antworten