Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Dubbio sul massimo numero ritornato da clock()
Forum - C/C++ - Dubbio sul massimo numero ritornato da clock()

Avatar
genni_96 (Normal User)
Pro


Messaggi: 108
Iscritto: 04/06/2010

Segnala al moderatore
Postato alle 0:26
Sabato, 04/06/2011
Salve a tutti, vorrei dei chiarimenti su una cosa:
la funzione clock() restituisce il tempo passato dall'inizio del programma che diviso per CLOCKS_PER_SEC è espresso in secondi.
Fin qui, tutto a a posto, ma siccome clock_t non è altro che un long, una volta che il tempo di esecuzione restituito da clock() supera il range massimo di un long, cosa succede?
Immagino che il tempo restituito non sia esatto, quindi come risolvere il problema??
Ipotizzando che io voglia creare un timer che dura un un anno, come dovrei fare??

PM Quote
Avatar
inconcepibile (Member)
Newbie


Messaggi: 11
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 14:15
Sabato, 04/06/2011
immagino che per un timer utilizzerai un struttura di ripetizione come il for o il while, e che ad ogni giro di ciclo dovrai aggiornare il tempo; quindi la mia idea e di salvare in una variabile il tempo ad ogni giro e confrontarla, sempre ad ogni giro, al tempo successivo come nell'esempio successivo, così facendo appena il clock si riazzera o diveta negativo (quando avrà raggiunto l'overflow) tu aumenterai di un unità un'ulteriore variabile così da essere sempre aggiornato sul tempo globale, seppur non avendolo per intero.

Codice sorgente - presumibilmente C/C++

  1. for (;;) {
  2. ....
  3. if (tempo_precedente < tempo_attuale) conta_overflow++;
  4. tempo_precedente = tempo_attuale;
  5. }



per poi stabilire quanto tempo è passato basterà eseguire il seguente calcolo:
tempo = conta_overflow * dimensione_long(circa 2^16-1) + tempo_attuale.
per far stare tutto nella variabile tempo conviene dichiararla "long long int" o qualsiasi altro tipo più grande di long ovviamente.

PM Quote
Avatar
genni_96 (Normal User)
Pro


Messaggi: 108
Iscritto: 04/06/2010

Segnala al moderatore
Postato alle 19:58
Domenica, 05/06/2011
Giusto, non ci avevo pensato,
però come dovrei fare se il tempo supera anche la dimensione di un long long int??

PM Quote
Avatar
inconcepibile (Member)
Newbie


Messaggi: 11
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 22:16
Domenica, 05/06/2011
In tal caso non conviene più usare una variabile convenzionale per tenere il tempo ma utilizzare qualcosa di più grande, un array.
Difatti si possono benissimo utilizzare le celle dell'array come singole cifre di un numero più grande o anche come gruppi di cifre; così facendo si potranno gestire numeri di grandezza arbitraria.
In questo caso conviene utilizzare una struttura per contenere le singole "sezioni" di tempo: secondi, minuti, ore. E visto che parliamo di un timer (quindi credo aggiornerà il tempo una volta al secondo o al minuto) basterà aumentare di 1 la l'attributo coi secondi, poi ogni 60 secondi aumentare di 1 i minuti e azzerare i secondi e così via ...
Proprio per questo il c++ nella libreria "time" inserisce la struttura tempo adatta per la gestione del tempo appunto, ecco come si presenta:
Codice sorgente - presumibilmente C++

  1. ]
  2. struct tm
  3. {
  4.         int     tm_sec; // secondi
  5.         int     tm_min; // minuti
  6.         int     tm_hour;        // ore
  7.         int     tm_mday;        // giorni del mese
  8.         int     tm_mon; // mesi
  9.         int     tm_year;        // anni
  10.         int     tm_wday;        // giorni della settimana
  11.         int     tm_yday;        // giorni dell'anno
  12.         int     tm_isdst;       // ora legare, solare
  13. };


Di questi attributi useremo solo quelli che ci servono senza fare tanta distinzioni tra giorni del mese, dell'anno o della settimana.
Detto ciò ecco come implementerei l'algoritmo:
Codice sorgente - presumibilmente Python

  1. tm tempo;
  2. // azzero le variabili del tempo all'inizio del conteggio
  3. tempo.tm_sec = 0;
  4. tempo.tm_min = 0;
  5. ...
  6.  
  7. for (;;) {
  8.     ....
  9.     // se i secondi hanno raggiunto i 59 torno a 0 ed aumento i minuti
  10.     if (tempo.tm_sec==59) {
  11.        tempo.tm_sec = 0;
  12.        // lo stesso ragionamento vale per le ore i minuti ...
  13.        if (tempo.tm_min==59) {
  14.            tempo.tm_min = 0;
  15.            if (tempo.tm_hour==23) {
  16.               tempo.tm_hour = 0;
  17.               ....
  18.            else tm_hour++;
  19.            }
  20.        else tm_min++;
  21.       }
  22.     else tm_sec++;
  23. }


Naturalmente si può implementare anche in altri modi, questo è quello che mi venuto sul momento. A questo punto la funzione clock() perde persino significato perché per aggiornare i cicli del for possiamo utilizzare la funzione _sleep, e per contare il tempo abbiamo la nostra bella struttura.

PM Quote