Speicherzugriffsfehler?



  • Hallo zusammen!
    Komme wegen Schule leider kaum noch zum programmieren, habe aber trotzdem über die letzte Zeit ein kleines Programm geschrieben, welches die Rente in Sekunden berechnen soll.
    Es compiliert alles einwandfrei, beim Ausführen jedoch bekomme ich einen Speicherzugriffsfehler. (So zumindest die Aussage von Windows)

    Hier mal ein paar Auschnitte des Quelltextes, vielleicht könnt ihr mir ja dann sagen, an welcher Stelle ich auf nicht verfügbaren Speicher zugreifen will.

    // Speichert das Geburts- sowie das aktuelle -Datum.
    struct Date
    {
            unsigned long sec;
            unsigned long min;
            unsigned long hour;
    
            unsigned long day;
            unsigned long month;
            unsigned long year;
    };
    
    // Klasse Pension, Übersicht.
    class Pension
    {
            private:
                    long double pensionInSec;
                    Date birthday;
    
            public:
                    Pension(); // Konstruktor
                    inline bool isLeapYear(unsigned long year); // Schaltjahr berechnen
                    void setBirthday(string& tempBirthday);
                    void getBirthday(); // Provisorium                
                    long double calculatePension();
                    long double calculateFreeTime();
    };
    
    // Hier nun die Funktion, in der der Fehler (meines Erachtens) auftritt.
    long double Pension::calculatePension()
    {
            time_t *currentTime;
            time(currentTime);
            tm *time = localtime(currentTime);
    
            // Zeit in Sekunden bis zur Rente mit PENSION Jahren (60) Jahren.
            pensionInSec = PENSION * 365 * 24 * 60 * 60;
    
            // Heutiges Datum
            Date today;
    
            //--------------------------------------------
            // Wenn ich fuer die folgenden drei Variablen
            // statische Werte (24 Std) * (60 Min) * (60 Sek) benutze, 
            // funktioniert alles.
    
            today.sec   = time -> tm_sec; // Hier vielleicht der Fehler?
            today.min   = time -> tm_min; //  "       "       "    "
            today.hour  = time -> tm_hour; // "       "       "    "
    
            //--------------------------------------------
    
            today.day   = time -> tm_mday;
            today.month = time -> tm_mon;
            today.year  = time -> tm_year + 1900;
    
            // Kompletter Alter speichern
            long double age;
    
            // Nur wenn heutiger Tag >= dem Geburtstag && heutiger Monat >= dem Geburtsmonat
            // aus der Differenz des heutigen Jahres minus dem Geburtsjahr das Alter erechnen.
            // Ansonsten heutiges Jahr - (Geburtsjahr + 1), da der Geburtstag noch nicht war.
            if(today.month >= birthday.month && today.day >= birthday.day)
                    age = today.year - birthday.year;
    
            else
                    age = today.year - (birthday.year + 1);
    
            // Erstmal die vollendeten Jahre in Sekunden
            age *= 365 * 24 * 60 * 60;
    
            // Monate mit 31 Tagen berechnen        
            int calcExtraDays = today.month / 2 + 1;
    
            // Schaltjahr?
            if(today.month >= 2 && isLeapYear((unsigned long)today.year))
                    calcExtraDays -= 1; // 29 Tage
            else if(today.month >= 2 && !isLeapYear((unsigned long)today.year))
                    calcExtraDays -= 2; // 28 Tage
    
            // Noch nicht vollendetes Jahr berechnen aus vollendeten Monaten und Tagen.        
            unsigned long currentYear = today.month * 30 + (today.day + calcExtraDays); 
    
            // Aktuelles Jahr (Bisher in Tagen) in Sekunden umrechnen                 
            currentYear *= today.hour * today.min * today.sec;
    
            // Vollendeten Jahre und aktuelles Jahr addieren
            age += currentYear;
    
            // Zeit in Sekunden bis zur Rente zurueckgeben.
            // Rechnung: Differenz aus dem Alter mit dem man Rente bekommt minus dem jetzigen Alter
    
            return pensionInSec - age;
    }
    

    Ach ja, nur nebenbei, stimmt die Formel zufällig?
    Ich berechne die Rente (mit 60 Jahren 🙄 ) in Sekunden folgendermaßen:

    RENTE = (60 Jahre) * (365 Tage) * (24 Stunden) * (60 Minuten) * (60 Sekunden)
    ALTER = (Vollendeten Jahre In Sekunden) + (Angebrochenes Jahr in Sekunden)
    SEKUNDEN_BIS_RENTE = RENTE - Alter

    Caipi 🙂



  • hi
    mir sind diese time funktionen nicht wirklich geläufig aber
    es sieht so aus als würdest du mit uninitialisierten pointern arbeiten

    time_t *currentTime;
            time(currentTime);
    

    sollte wahrscheinlich heissen

    time_t currentTime;
            time(&currentTime);
    

    das ist nur eine vermutung
    kurt



  • @ ZuK
    Ja, danke!
    Funktioniert 🙂

    Aber kannst du mir vielleicht den Unterschied zwischen den beiden Dingen sagen?
    Ich übergebe doch mit beiden Versionen die Adresse und intialisiert ist &currentTime doch auch nicht, oder?

    Caipi



  • time_t *currentTime;
    

    currentTime ist nicht initialisiert kann irgendwohin zeigen.der nachfolgende Aufruf

    time(currentTime);
    

    füllt die time_t struktur auf die currentTime zeigt => schreibt irgendwohin => crash

    bei der anderen version

    time_t currentTime;
    

    wird speicher der grösse sizeof(time_t) am stack reserviert und

    time(&currentTime);
    

    initialisiert diesen

    so gehts auch

    time_t *currentTime = new time_t;
       time(currentTime);
    

    hier wird mit new time_t; speicher an heap reserviert. in diesem fall darfst du aber nicht vergessen den speicher mit

    delete currentTime;
    

    wieder freizugeben.
    K.



  • Danke, habs (endlich) verstanden 🙂

    Caipi


Anmelden zum Antworten