Gå til innhold

Tid, justering av enheter.


Gjest Slettet-Pqy3rC

Anbefalte innlegg

Gjest Slettet-Pqy3rC

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
Videoannonse
Annonse

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 av GeirGrusom
Lenke til kommentar
Gjest Slettet-Pqy3rC

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

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 av jonny
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å
×
×
  • Opprett ny...