View Full Version : [C] stampare time_t
qual è il modo corretto secondo lo standard di stampare un valore di tipo time_t con printf senza che il gcc mi dia warnings? ho provato con %d, %u, %lld, %llu, sempre warning. debbo fare cast esplicito?
dimenticavo di specificare un piccolo dettaglio: la prof mi ha obbligato per non si sa quale motivo ad utilizzare C89 -.-'
ma non credo cambi nulla per questo problema.
incuriosito mi sono fatto trascinare da google su wikipedia e ho scoperto che:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now;
struct tm ts;
char buf[80];
// Get the current time
time(&now);
// Format and print the time, "ddd yyyy-mm-dd hh:mm:ss zzz"
ts = *localtime(&now);
strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", &ts);
printf("%s\n", buf);
return 0;
}
:eek: non si finisce mai di scoprire cose nuove sul C :D
non è una novità per me, il problema è che dovevo stampare proprio il valore numerico di time_t, non che ore sono :D
poi però ho visto che la risoluzione di un time_t è di solo un secondo, mentre a me serve qualcosa di più preciso perché ciò che devo fare è misurare il tempo di esecuzione di un algoritmo, quindi ho scoperto la funzione clock. però non riesco ad usarla: prendo il clock prima e dopo l'algoritmo ma la differenza che viene stampata risulta sempre nulla (l'ho stampata con %ld). mi sa che ho capito male cosa restituisce quella funzione. per ora sto semplicemente rimandando il problema, che significa che riupperò tra qualche giorno :p.
non è una novità per me, il problema è che dovevo stampare proprio il valore numerico di time_t, non che ore sono :D
poi però ho visto che la risoluzione di un time_t è di solo un secondo, mentre a me serve qualcosa di più preciso perché ciò che devo fare è misurare il tempo di esecuzione di un algoritmo, quindi ho scoperto la funzione clock. però non riesco ad usarla: prendo il clock prima e dopo l'algoritmo ma la differenza che viene stampata risulta sempre nulla (l'ho stampata con %ld). mi sa che ho capito male cosa restituisce quella funzione. per ora sto semplicemente rimandando il problema, che significa che riupperò tra qualche giorno :p.
Uso di clock:
#include <time.h>
#include <stdio.h>
void main(void)
{
long i;
clock_t start,end;
start=clock();
for(i=0;i<1000000000;i++)
;
end=clock();
printf("Tempo trascorso: %f secondi\n",(end-start)/CLK_TCK);
}
Su un PC x86 la risoluzione e' di circa un diciottesimo di secondo (1/(65536/3600)).
ilsensine
20-10-2007, 22:22
non è una novità per me, il problema è che dovevo stampare proprio il valore numerico di time_t, non che ore sono :D
poi però ho visto che la risoluzione di un time_t è di solo un secondo, mentre a me serve qualcosa di più preciso perché ciò che devo fare è misurare il tempo di esecuzione di un algoritmo, quindi ho scoperto la funzione clock. però non riesco ad usarla: prendo il clock prima e dopo l'algoritmo ma la differenza che viene stampata risulta sempre nulla (l'ho stampata con %ld). mi sa che ho capito male cosa restituisce quella funzione. per ora sto semplicemente rimandando il problema, che significa che riupperò tra qualche giorno :p.
clock ha la granularità del tick di sistema, è poco utile per misure precise. Usa gettimeofday
stdecden
21-10-2007, 13:20
Io ho scritto una volta questo codice:
#pragma once
#include <windows.h>
class cTimer
{
private:
LARGE_INTEGER LastTime;
LARGE_INTEGER PerformanceFrequency;
public:
cTimer();
void Reset();
double GetTimeElapsedInSeconds();
double GetTimeElapsedInMilliseconds();
};
#include "Timer.h"
#include <windows.h>
cTimer::cTimer()
{
QueryPerformanceFrequency(&this->PerformanceFrequency);
QueryPerformanceCounter(&this->LastTime);
}
void cTimer::Reset()
{
QueryPerformanceCounter(&this->LastTime);
}
double cTimer::GetTimeElapsedInSeconds()
{
LARGE_INTEGER CurrentTime;
QueryPerformanceCounter(&CurrentTime);
double Time = (double)((UINT64)CurrentTime.QuadPart - (UINT64)this->LastTime.QuadPart)/(double)(this->PerformanceFrequency.QuadPart);
return Time;// <= 0.05 ? Time : 0.05;
}
double cTimer::GetTimeElapsedInMilliseconds()
{
LARGE_INTEGER CurrentTime;
QueryPerformanceCounter(&CurrentTime);
double Time = (double)(((UINT64)CurrentTime.QuadPart - (UINT64)this->LastTime.QuadPart)/(double)(this->PerformanceFrequency.QuadPart) * 1000);
return Time;// <= 50 ? Time : 50;
}
:( Ma temo funzioni solo su windows!!
qual è il modo corretto secondo lo standard di stampare un valore di tipo time_t con printf senza che il gcc mi dia warnings? ho provato con %d, %u, %lld, %llu, sempre warning. debbo fare cast esplicito?
dimenticavo di specificare un piccolo dettaglio: la prof mi ha obbligato per non si sa quale motivo ad utilizzare C89 -.-'time_t se non sbaglio è poi nient'altro che un long int.
prova.c
#include <stdio.h>
#include <time.h>
int main (void)
{
time_t now = time (NULL);
printf ("%ld\n", now);
return 0;
}
gcc -Wall -ansi -pedantic -o prova prova.c
non mi dà alcun warning (provato su una Slackware)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.