Gå til innhold

[Løst] Bruk av tm og time_t


Anbefalte innlegg

Heisann

Driver for tiden å lager meg en liten verktøykasse til bruk generelt i programmering, men sliter litt med dette...

Skal lage en funksjon som henter ut tid fra PCen min og jeg bruker ctime til dette.

Måten jeg har oppfattet dette skal gjøres på er:

 

tm* tidspunkt;
time_t timer;

time(&timer);
tidspunkt = localtime(&timer);

hr = tidspunkt -> tm_hour;
min = tidspunkt -> tm_min;
sec = tidspunkt -> tm_sec;

Hvor hr, min og sec er referanseoverførte variabler.

 

Dette fungerer som det skal, men siden jeg skal bruke tiden som blir hentet ut og lagret i "tidspunkt" pekeren i flere funksjoner i klassen vil jeg gjerne legge denne så den blir deklarert i klassen som private data og ikke i hver enkelt funksjon som skal ha disse funksjonene derfor prøvde jeg å flytte linjene

 

tm* tidspunkt;
time_t timer;

Opp i private delen av klassen

 

Jeg får da en av to mulige feil, enten krasjer programmet uten noen warnings eller errors fra Visual Studio eller så får jeg error "ptime != NULL"

 

Koden min ser da slik ut:

class TimeDate {	  
private:	  
	int date[13];	
	tm* tidspunkt;	
	time_t timer;	
public:	  
	TimeDate();	
	 bool LeapYear(int year);
	 void GetDate(int &yr, int &mnt, int &day);//tidspunkt og timer blir brukt
	 void GetTime(int &hr, int &min, int &sec);//i disse to funksjonene
	 void PrintDate();  
	 void PrintDay();  
	 void PrintTime();  
};

 

void TimeDate::GetTime(int &hr, int &min, int &sec) {

 time(&timer);	//Ifølge debug er det på denne linjen at programmet krasjer
 tidspunkt = localtime(&timer);
 hr = tidspunkt -> tm_hour;  
 min = tidspunkt -> tm_min;
 sec = tidspunkt -> tm_sec;  
}

 

Det er når jeg skriver programmet slik at det krasjer, hvis jeg flytter tidspunkt og timer ned i funksjonen så fungerer det uten feil.

Dette er bare to funksjoner, men det kommer flere funksjoner som skal bruke disse to (Spesielt tidspunkt, for variabler som tm_wday og de)

 

Hjernen min klarer ikke finne ut hvorfor dette ikke går... Det er helt sikkert en liten fillefeil som nesten ikke synes, men jeg klarer ikke finne den. Programmet starter, men krasjer så fort time(&timer) blir kjørt.

Prøvde å skrive om den linjen til

timer = time(NULL) 

Som det gjøres i microsoft sine eksempler, men får samme feil da.

 

Jeg er stuck og håper noen her har peiling på hva jeg mangler/gjør feil...

Lenke til kommentar
Videoannonse
Annonse

Hmm, jeg kan ikke egentlig se noen feil her. Koden kompilerer og kjører fint her (GCC på OS X).

... erh tar å poster hele koden da siden du må ha skrevet en del selv så kan det være noe forskjell der..

///////////////////////////////////////////////////////////////////////////////
#if !defined (__timedate_h)	
#define __timedate_h	
////////////////////////////////////INCLUDES///////////////////////////////////
#include <iostream>	
#include <ctime>  
////////////////////////////////////CLASSES////////////////////////////////////
class TimeDate {  
private:
 int date[13];  
 tm* tidspunkt;	
 time_t timer;	
public:
 TimeDate();
 bool LeapYear(int year);
 void GetDate(int &yr, int &mnt, int &day);
 void GetTime(int &hr, int &min, int &sec);
 void PrintDate();
 void PrintDay();  
 void PrintTime();
};
///////////////////////////////////////////////////////////////////////////////
#endif
///////////////////////////////////////////////////////////////////////////////

Dette er timedate.h filen min

 

 

////////////////////////////////////INCLUDES///////////////////////////////////
#define _CRT_SECURE_NO_WARNINGS  
#include <iostream>	  .
#include <ctime>	
//////////////////////////////SELFMADE INCLUDES////////////////////////////////
#include "timedate.h"	
using namespace std;	
//////////////////////////////FUNCTION DEFINITIONS/////////////////////////////
TimeDate::TimeDate() {
date[0] = 0;	
date[1] = 31;	
date[2] = 0;	
date[3] = 31;	
date[4] = 30;	
date[5] = 31;	
date[6] = 30;	
date[7] = 31;	
date[8] = 31;	
date[9] = 30;	
date[10] = 31;	
date[11] = 30;	
date[12] = 31;	
}
bool TimeDate::LeapYear(int year) {
return ((year % 4 == 0 && year % 100 != 0) || ( year % 400 == 0));
}		
void TimeDate::GetDate(int &yr, int &mnt, int &day) {
tm* dat;	  
time_t date;	
time(&date);	
dat = localtime(&date);  
yr = dat -> tm_year + 1900;  
mnt = dat -> tm_mon + 1;  
day = dat -> tm_mday;  
}
void TimeDate::GetTime(int &hr, int &min, int &sec) {
//tm* tidspunkt;	  
//time_t timer;	
time(&timer);	
tidspunkt = localtime(&timer);
hr = tidspunkt -> tm_hour;  
min = tidspunkt -> tm_min;  
sec = tidspunkt -> tm_sec;  
}
void TimeDate::PrintDate() {  
int year,	  
 month,	
 day;	  
GetDate(year, month, day);  
cout << "\n\t"	
  << ((day < 10)? "0" : "") << day
  << ((month < 10)? ".0" : ".") << month
  << "." << year;  
}
void TimeDate::PrintTime() {  
int hour, hour2,	
 min, min2,	
 sec, sec2;	

GetTime(hour, min, sec);  

cout << "\n\t"	
  << ((hour < 10)? "0" : "") << hour
  << ((min < 10)? ":0" : ":") << min
  << ((sec < 10)? ":0" : ":") << sec;
}

Og her er timedate.cpp filen min

 

 

Slik det står der så går programmet gjennom Visual Studio, men krasjer så fort den kommer til linjen "time(&timer)" i funksjonen GetTime()

 

#include "timedate.h"
#include <iostream>
using namespace std;
TimeDate* tid;
int main() {


tid -> PrintTime();
//tid -> PrintDate();

cin.get();
return 0;
}

Kjører det med dette som main bare for å teste det...

Lenke til kommentar

Noen spesiell grunn til at du vil ta vare på tm og time_t i klassen din? Virker på meg bare som bloat. Skal du kunne polle denne for tid flere ganger eller skal den representere et tidspunkt?

 

I C++11 er dette en del av std.

Vel... hver gang jeg skal skrive ut tiden eller datoen (eller begge deler) har jeg jo tenkt at den skal hente ut datoen på nytt for å få den oppdatert så slik sett kan den jo stå i hver funksjon, men når jeg f.eks skal hente ut dagnavnet (man, tir, ons osv...) eller månednavnet, så tenkte jeg at det hadde vært kjekt å kunne bruke det som alt har blitt hentet ut og lagret i klassen.

Det pluss at jeg har blitt opplært til at duplisert kode skal unngås hvis mulig, og det ER mulig da jeg har en verktøy kasse jeg har fått av min kjære lærer der han har gjort nettopp det jeg ikke får til nå.

 

Jeg burde kanskje også nevne at jeg bare har fullført grunnleggende programmering og skal opp i eksamen i objekt orientert nå over helgen så er en del ting jeg ikke har peiling på :p

 

Jeg kan ikke se at du initialiserer tid-variabelen din i main.

Dette blir gjort globalt (Står linjen over int main() ), dette var noe jeg gjorde av ren vane og kunne vel såvidt jeg vet vært gjort inni main også?

Lenke til kommentar

Den er deklarert, ikke definert. Du må isåfall new-e den. Og den bør være i main (eller et annet scope).

 

That being said er jeg enig i at duplisering av kode er en uting, men jeg synes også "unødvendige" variabler i en klasse er en uting. Egentlig synes jeg hele designet er alt for flaky, men der har du meg.

 

Hvor skal du ha eksamen? :--)

Endret av Lycantrophe
Lenke til kommentar

Den er deklarert, ikke definert. Du må isåfall new-e den. Og den bør være i main (eller et annet scope).

 

That being said er jeg enig i at duplisering av kode er en uting, men jeg synes også "unødvendige" variabler i en klasse er en uting. Egentlig synes jeg hele designet er alt for flaky, men der har du meg.

 

Hvor skal du ha eksamen? :--)

gjøvik oooog det med new har du forsåvidt rett i... Legger opp til en fantastisk eksamen ser jeg... :p

Lenke til kommentar

Egentlig rart at det i det hele tatt kommer så langt som å sprette inn i metoden. Fiks det og kjør (hadde du allokert på stack (som du burde) hadde ikke dette kunnet skje, og dette hadde skjedd automatisk) og sjekk om samme feil dukker opp.

Det funker når jeg legger til new (merkelig nok :p) men hvorfor det da funker når jeg legger deklareringen av tm og time_t inn i funksjonene er jo fortsatt et mysterium for meg...

Takker for hjelp :p Som det somregel er med meg og programmering var det bare en feil som jeg burde ha lagt merke til ...

Lenke til kommentar

Skal jeg tippe: siden du kjørte med en peker (til garbage) ble den fortsatt sendt som this uten at noe er, vel, feil. Problemet dukker opp når du prøver å hente noe fra this' offset som ikke er initialisert. Da smeller det.

 

Derfor dukket bare problemet opp når du flyttet de inn i klassen, fordi det tidligere aldri var noe behov for å hente noe fra klassen. Dette gjorde metoden i praksis static.

Endret av Lycantrophe
  • Liker 1
Lenke til kommentar

Skal jeg tippe: siden du kjørte med en peker (med garbage) ble den fortsatt sendt som this. Problemet dukker opp når du prøver å hente noe fra this' offset som ikke er initialisert. Da smeller det.

 

Derfor dukket bare problemet opp når du flyttet de inn i klassen, fordi det tidligere aldri var noe behov for å hente noe fra klassen. Dette gjorde metoden i praksis static.

hmmm ok :p

Daa får jeg bare be og håpe at jeg husker dette til eksamen... :p

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...