Gjest Slettet-Pqy3rC Skrevet 9. oktober 2013 Del Skrevet 9. oktober 2013 Okey; En triviell, men allikevel ikke så triviell, greie. Data; struct timespan { short days; long hours; long minutes; long seconds; long millisec; void Clear() {days=hours=minutes=seconds=millisec=0;}; void Adjust() {?}; }; Det er vel selvfolklarende hva denne inneholder. Det vi/jeg trenger en metode (f.eks. Adjust() over) å "justere" innholdet på, f.eks; timespan ts; ts.Clear(); ts.hours = 120; ts.minutes = -120; ts.Adjust(); Nå skal følgende være sant (etter Adjust()) ; ts.days == 4 ts.hours == 22 ts.minutes == 0 Adjust() skal altså rette alle medlemmer i timespan til samme fortegn og fordele til "naturlig" mengde av hvert tids element. Jeg har gjort dette ved hjelp av en _int64 (alt om til millisec og så fordele), men har (minst) ett sted hvor jeg ikke kan benytte _int64. Når jeg prøver med kun bruk av short/long blir det himla komplisert (og treigt!). Rutinen bør være så rask som mulig da dette skal kjøres noe aldeles forferdelig mange ganger. Noen forslag ? Lenke til kommentar
GeirGrusom Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 (endret) Det som er vanlig er å bare lagre millisekunder og regne ut andre ting utifra det. typedef unsigned long long int timespanvalue; struct timespan { private: const timespanvalue value; public: const timespan Add(const timespan& other) const { return timespan(value + other.value); } timespan(const timespanvalue milliseconds) : value(milliseconds) { } const timespanvalue Value() const { return value; } }Kan være et utgangspunkt. Endret 10. oktober 2013 av GeirGrusom Lenke til kommentar
Gjest Slettet-Pqy3rC Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 Det som er vanlig er å bare lagre millisekunder og regne ut andre ting utifra det. Ser den, men utfordringen her er altså at jeg ikke kan/bør bruke 64 bit integers ("_int64"/"long long"). Lenke til kommentar
Lycantrophe Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 Hva er grunnen til at du ikke kan bruke 64-bit ints? Lenke til kommentar
GeirGrusom Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 (endret) Ser den, men utfordringen her er altså at jeg ikke kan/bør bruke 64 bit integers ("_int64"/"long long").edit: vil påpeke at du har et 144-bit heltall i koden over. Endret 10. oktober 2013 av GeirGrusom Lenke til kommentar
jonny Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 (endret) Her er en måte å gjøre det på, hvor rask den er (eller hvor riktig den gjør ting) veit jeg ikke. Og som allerede er påpekt: du har 144 bits med informasjon i struct'en, det er dermed muligheter for overflow/underflow ved justering av verdier, det er ingen sjekk av slikt i denne koden. #define MS_PER_SEC 1000 #define SECS_PER_MIN 60 #define MINS_PER_HOUR 60 #define HOURS_PER_DAY 24 void Adjust() { seconds += millisec / MS_PER_SEC; millisec %= MS_PER_SEC; minutes += seconds / SECS_PER_MIN; seconds %= SECS_PER_MIN; hours += minutes / MINS_PER_HOUR; minutes %= MINS_PER_HOUR; days += hours / HOURS_PER_DAY; hours %= HOURS_PER_DAY; // adjust for sign if (days < 0 || (days == 0 && (hours < 0 || (hours == 0 && (minutes < 0 || (minutes == 0 && (seconds < 0 || (seconds == 0 && millisec < 0) )))) ))) { // negative values seconds += (millisec <= 0 ? 0 : 1); millisec -= (millisec <= 0 ? 0 : MS_PER_SEC); minutes += (seconds <= 0 ? 0 : 1); seconds -= (seconds <= 0 ? 0 : SECS_PER_MIN); hours += (minutes <= 0 ? 0 : 1); minutes -= (minutes <= 0 ? 0 : MINS_PER_HOUR); days += (hours <= 0 ? 0 : 1); hours -= (hours <= 0 ? 0 : HOURS_PER_DAY); } else { // positive values seconds -= (millisec >= 0 ? 0 : 1); millisec += (millisec >= 0 ? 0 : MS_PER_SEC); minutes -= (seconds >= 0 ? 0 : 1); seconds += (seconds >= 0 ? 0 : SECS_PER_MIN); hours -= (minutes >= 0 ? 0 : 1); minutes += (minutes >= 0 ? 0 : MINS_PER_HOUR); days -= (hours >= 0 ? 0 : 1); hours += (hours >= 0 ? 0 : HOURS_PER_DAY); } } Endret 11. oktober 2013 av jonny Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå