Datum erhöhen



  • klar bekommst du bei non falsche Werte, WEIL diese struct noch nie initiliaisert wurde und jeden beliebigen Wert enthalten kann... Weshalb rückgabewerte für Erfolg/Misserfolg sinnvoll wären.

    void init_day(Date& dd,int y,int m,int d) // die richtigen werte prüfen 
    { 
        if(y<1900 || y>2200 || m<1 || m>12 || d<1 || d>31)
        { 
            dd.y = 0; 
            dd.m = 0; 
            dd.d = 0; 
        }
        else 
        { 
            dd.y = y; 
            dd.m = m; 
            dd.d = d; 
        } 
    }
    


  • Du meinst do etwas wie:

    Date():y(0),m(0),d(0){}
    


  • winux schrieb:

    Du meinst do etwas wie:

    Date():y(0),m(0),d(0){}
    

    Ein Konstruktor wäre natürlich sehr hilfreich.



  • Jetzt bekomme ich drei werte 0,1,0.



  • Was hast du denn nun gemacht?



  • So geschrieben wie du es gesagt hast.



  • du bekommst die Eins weil du immernoch den Fehler aus 10 posts mitschleppst... In Add_day steht n = 1, welches dort nicht stehen darf. darum auch die 1 in der zweiten Ausgabe.

    Edit: Ich hatte einen Tippfehler bei der Datumsabfrage muss natürlich anstelle d>3 -> d>31 lauten. Dann sollte auch alles gehen. sry



  • Danke für den tipp genau da war der Fehler. Aber dort gibt es jetzt einen neuen Fehler wenn man Tag initialisiert und mit n addiert ( so etwas 29 + 3 = 32) dann erhaltet man einen ungültigen Tag wert.



  • Das ist dann deine nächste Aufgabe, wie muss Add-day aussehen, damit beim hinzufügen von Tagen die Tage/Monate/Jahre Monatsenden immer richtig angezeigt werden inklusive Schaltjahr versteht sich.

    Leiste erstmal was und wenn nichts klappt dann frage erneut.



  • Offtop: Heute scheint der Tag der bekloppten Aufgaben zu sein ... erfind mal wer nen TÜV für c++ Profs...



  • Pisastudie macht auch vor Professoren keinen Halt!



  • Jetzt soll ich die Werte nicht mit cout sondern mit dem ostream& operator ausgeben. Doch der Compiler sagt das: error C2601: 'operator<<': Lokale Funktionsdefinitionen sind unzulässig.

    void day_prog()
    {
    	Date today;
    	init_day(today,1978,6,25);
    //	cout << today.d << endl;
    
    	Date tomorrow;
    	tomorrow.d = today.d;
    	add_day(tomorrow,1);   
    //	cout << tomorrow.d << endl;
    
    	Date non;           
    	init_day(non,789,56,-9);
    //	cout << non.d << endl;
    
    	ostream& operator<<(ostream& os,const Date& today)
    	{
    		return os << '(' << today.d << ')';
    	}
    }
    
    int main()
    {
        day_prog();
    
    	keep_window_open();
        return 0;
    }
    


  • Die Fehlermeldung triffts auf den Punkt. Du kannst keine Funktionen innerhalb anderer Funktionen definieren.



  • Jetzt habe ich es außerhalb der Funktion geschrieben, das Programm startet aber die Konsole zeigt nichts an.



  • Deine Ausgaben sind sicher noch auskommentiert oder gar nicht erst geschrieben...

    Falls nicht: Zeig den aktuellen Code (aber überleg bitte kurz, um offensichtliche Fehler zu vermeiden).



  • Das cout ist absichtlich auskommentiert weil die Übung sagt das es mit dem ostream& operator ausgeben werden soll.

    #include "stdafx.h"
    #include "std_lib_facilities.h"
    
    using namespace std;
    
    struct Date{
    	int y;  // Jahr
    	int m;  // Monat
    	int d;  // Tag
    };
    
    void init_day(Date& dd,int y,int m,int d) // absichtlich falsche werte
    {
        if(y<1900 || y>2200 || m<1 || m>12 || d<1 || d>31) 
        { 
            dd.y = 0; 
            dd.m = 0; 
            dd.d = 0; 
        } 
        else 
        { 
            dd.y = y; 
            dd.m = m; 
            dd.d = d; 
        } 
    }
    
    void add_day(Date& dd,int n) // erhöhe Tag mit n
    {
         dd.d = dd.d + n;
    }
    
    void day_prog()
    {
    	Date today;
    	init_day(today,1978,6,25);
    //	cout << today.d << endl;
    
    	Date tomorrow;
    	tomorrow.d = today.d;
    	add_day(tomorrow,1);    
    //	cout << tomorrow.d << endl;
    
    	Date non;           // zum testen des konstruktors 
    	init_day(non,789,56,-9);
    //	cout << non.d << endl;
    
    }
    
    ostream& operator<<(ostream& os,const Date& today)
    	{
    		return os << '(' << today.d << ')';
    	}
    
    int main()
    {
      // irgendwo sollte etwas stehen damit ostream ausgegeben werde soll
    
        keep_window_open();
        return 0;
    }
    


  • Date date;
    init_day(date, 1955, 5, 15);
    
    ostream *strm = &cout;
    *strm << "Jahr: " << date.y << " Monat: " << date.m << " Tag: " << date.d << endl;
    


  • Danke für den Tipp aber geht das nicht mit dem ostream& operator. Mit diesem operator:

    ostream& operator<<(ostream& os,const Date& today)
        {
            return os << '(' << today.d << ')';
        }
    


  • winux, du rufst den operator<< nirgends auf. Erwartest du, dass er sich von Zauberhand selbstständig macht und doch etwas ausgibt?

    Zu deinem letzten Post: Doch, das ist ja gerade was HighLigerBiMBam tut! Ich hab das Gefühl, du solltest noch einiges in deinem C++-Buch nachlesen.

    P.S. Der ostream -Zeiger ist eine unnötige Indirektion. Der Operator wird auch direkt bei std::cout aufgerufen.



  • So die Übung ist gelöst, danke an alle für die Hilfe.


Anmelden zum Antworten