PDA

View Full Version : [C] stampare time_t


71104
20-10-2007, 10:50
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.

k0nt3
20-10-2007, 11:52
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

71104
20-10-2007, 13:04
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.

Lyane
20-10-2007, 16:49
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!!

andbin
21-10-2007, 14:04
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)