Defaultkonstruktor Datumsklasse - Datum falsch



  • Ich schreibe gerade an einer Datumsklasse.
    Nachdem ich nach einigem herumprobieren schon gemerkt habe, dass ich statt der Funktion time() die Funktion stime() nutzen muss, stehe ich nun vor einem kleinen Problem, was allerdings nicht programmierungstechnischer Natur zu sein scheint. Denn statt das aktuelle Datum zu verwenden, wird bei mir leider nur der 7.4.1974 gesichert. Das jetzt zu umzubauen, dass es korrekt funzt wäre ja nicht das Problem, aber ich verstehe nicht, warum dieser Fehler auftritt, denn meiner Meinung anch habe ich doch das Datum richtig hochgerechnet.

    Hier der Codeausschnitt:

    #include <ctime>
    #include "date.hpp"
    
    using namespace std;
    
    /***************************** Defaultkonstruktor *********************************/
    /* setzt als Datum das Aktuelle */
    Date::Date()
    {
    	#ifdef __unix__					/* Anweisung unter einem Unixsystem */
    		time_t seconds;				/* zum Speichern der veragngenen Zeit in Sekunden */
    		struct tm *time;				/* zum Speichern des Datums */
    
    		stime(&seconds);			/* Sekunden auslesen */
    		time = localtime(&seconds);	/* reales Datum berechnen */
    
    		tag = time->tm_mday;		/* Tag speichern */
    		monat = time->tm_mon+1;	/* Monat speichern */
    		jahr = time->tm_year+1900;	/* Jahr speichern */
    
    	#endif
    
    	#ifdef WIN32
    
    	#endif
    }
    


  • time_t seconds;              
    	struct tm *t;             
    
        time(&seconds);            
        t = localtime(&seconds);   
    
    	cout<<t->tm_mday<<" "<<t->tm_mon+1 <<" " << t->tm_year+1900<<endl;
    

    😕



  • @elise: so hab ich es auch probiert, allerdings funzte der Code unter Linux schon mal nicht (unter Win hab ichs noch nicht getestet). Dann hab ich mir mal die time.h angesehen wo drin stand, dass in __cpluplus

    stime()
    

    verwendet werden muss. Danach lief der Code zwar unter Linux aber eben mit der falschen Ausgabe.

    Hier nochmal das Headefile zur Klasse:

    #ifndef DATE_INCLUDED
    	#define DATE_INCLUDED
    
    	class Date
    	{
    
    		public:
    			Date();									/*Defaultkonstruktor - setzt ein Standartdatum */
    			Date(int tag, int monat, int jahr);			/* Konstruktor mit Zahlen */
    			Date(int tag, String smonat, int jahr);		/* Konstruktor mit Monatsname */
    
    			void setDate(int tag, int monat, int jahr);		/* Datum neu setzen */
    			void setDate(int tag, String smonat, int jahr);	/* Datum neu setzen mit Monatsname */
    			void setDay(int tag);							/* Tag neu setzen */
    			void setMonth(int monat);						/* Monat neu setzen */
    			void setMonth(String smonat);					/* Monat als Zeichenkette neu setzen */
        		void setYear(int jahr);							/* Jahr neu setzen */
        		void show(void);								/* Datum ausgeben */
    
    			friend ostream& operator<<(ostream& os, const Date &date); 	/*ueberladener Ausgabeoperator */
    
    		private:
    			int tag;						/* Tag als Zahl */
    			int monat;					/* Monat als Zahl */
    			String smonat;				/* Monat als String */
    			int jahr;						/* Jahr als Zahl */
    	};
    
    #endif
    


  • Ein Standardkonstruktor macht bei einer Datei-Klasse keinen Sinn.



  • Was ist eine Datei-Klasse?
    Selbst wenn ich auf den Standartkonstruktor verzichten könnte, sehe ich trotzdem nicht wo der Fehler bei der Umrechnung in das "reale Datum" liegt.

    Noch eine andere Frage. Wenn ich jetzt meine Memberdaten abwandeln würde, so dass der Monat sowohl als String, als auch als Integer, den selben Variablennamen tragen,

    private:
                int tag;                        /* Tag als Zahl */
                int monat;                    /* Monat als Zahl */
                String monat;                /* Monat als String */
                int jahr;                        /* Jahr als Zahl */
    

    wie greife ich dann auf einen der beiden zu?

    Denn ein

    cout << this->monat;
    

    ist für den Compiler ja irreführend.



  • du kannst nicht zwei variablen mit dem selben namen im selben scope haben



  • stime() steht für "set time"! mit stime() setzt du die systemzeit! du mußt time() nehmen. da du aber die systemzeit mit dem aufruf von stime() bereits verstellt hast, mußt du sie zuerst wieder korrekt neu einstellen!



  • Konfusius schrieb:

    stime() steht für "set time"! mit stime() setzt du die systemzeit! du mußt time() nehmen. da du aber die systemzeit mit dem aufruf von stime() bereits verstellt hast, mußt du sie zuerst wieder korrekt neu einstellen!

    OMG - da programmiert einer als root? 😮

    @elise: so hab ich es auch probiert, allerdings funzte der Code unter Linux schon mal nicht

    mein man-page sagt, dass du _SVID_SOURCE #definen musst, damit du von der GlibC den Prototypen bekommst. vielleicht funktioniert es deshalb nicht.

    mfg



  • *man-page noch einmal genau gelesen*

    terraner schrieb:

    OMG - da programmiert einer als root? 😮

    ...

    mein man-page sagt, dass du _SVID_SOURCE #definen musst, damit du von der GlibC den Prototypen bekommst. vielleicht funktioniert es deshalb nicht.

    ich sehe gerade, dass bei der benutzung als normaler user, die funktion -1 zurückgibt. also muss man nicht root sein, funktionieren tut's trotzdem nicht.

    Noch eine andere Frage. Wenn ich jetzt meine Memberdaten abwandeln würde, so dass der Monat sowohl als String, als auch als Integer, den selben Variablennamen tragen

    du kannst den monat auch nur als int speichern und für die ausgabe immer mit einer hilfsklasse in einen string umwandeln.

    mfg



  • @Maxi: danke, weiß ich bescheid

    @Konfusius and @terraner: also als root programmiere ich nicht und gehe auch nicht davon aus, dass ich die systemzeit verstellt habe. wenn doch werde ich es ja merken, wenn irgendwann die time() FKt. geht.

    Ich habe gerade mal die Sache mit dem

    #define _SVID_SOURCE
    

    funzt leider nicht, er meint ich würde es redefinieren. Der Fehler lautet im übrigen: `time' cannot be used as a function



  • Ich habe das Problem gelöst!

    Ich habe lediglich andere Variablennamen verwendet

    time_t t;
    struct tm *zeit;
    

    und schon gings.

    Danke an alle, die geholfen haben! 👍


Anmelden zum Antworten