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 - AlterCaipi
-
hi
mir sind diese time funktionen nicht wirklich geläufig aber
es sieht so aus als würdest du mit uninitialisierten pointern arbeitentime_t *currentTime; time(currentTime);
sollte wahrscheinlich heissen
time_t currentTime; time(¤tTime);
das ist nur eine vermutung
kurt
-
@ ZuK
Ja, danke!
FunktioniertAber kannst du mir vielleicht den Unterschied zwischen den beiden Dingen sagen?
Ich übergebe doch mit beiden Versionen die Adresse und intialisiert ist ¤tTime 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(¤tTime);
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