2009-09-24 12 views
13

Sto provando a stampare un valore di tipo temporale. In realtà io sono in grado di stampare, ma ottengo il seguente avvertimento:Programmazione UNIX. struct timeval come stamparlo (programmazione C)

marcatori multipli in questa linea

  • formato '% ld' aspetta digitare 'long int', ma l'argomento 2 ha tipo 'struct timeval '

Il programma compila e stampa i valori, ma vorrei sapere se sto facendo qualcosa di sbagliato. Grazie.

printf("%ld.%6ld\n",usage.ru_stime); 
    printf("%ld.%6ld\n",usage.ru_utime); 

in cui l'utilizzo è di tipo

typedef struct{ 
    struct timeval ru_utime; /* user time used */ 
    struct timeval ru_stime; /* system time used */ 
    long ru_maxrss;  /* maximum resident set size */ 
    long ru_ixrss;   /* integral shared memory size */ 
    long ru_idrss;   /* integral unshared data size */ 
    long ru_isrss;   /* integral unshared stack size */ 
    long ru_minflt;  /* page reclaims */ 
    long ru_majflt;  /* page faults */ 
    long ru_nswap;   /* swaps */ 
    long ru_inblock;  /* block input operations */ 
    long ru_oublock;  /* block output operations */ 
    long ru_msgsnd;  /* messages sent */ 
    long ru_msgrcv;  /* messages received */ 
    long ru_nsignals;  /* signals received */ 
    long ru_nvcsw;   /* voluntary context switches */ 
    long ru_nivcsw;  /* involuntary context switches */ 
}rusage; 

struct rusage usage; 
+0

bene naturalmente so timeval non è di tipo long ecco perché mi dà l'avvertimento, ma c'è un modo per farlo correttamente? – user69514

+0

Ragazzi rock ... avete funzionato perfettamente ... – user69514

risposta

20

In the GNU C Library, struct timeval:

è dichiarata in sys/time.h e ha seguenti membri:

long int tv_sec 

Questo rappresenta il numero di interi secondi di tempo trascorso.

long int tv_usec 

Questo è il resto del tempo trascorso (una frazione di secondo), rappresentato come numero di microsecondi. È sempre meno di un milione.

Quindi sarà necessario fare

printf("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 

per ottenere un timestamp "ben formattata", come 1.000123.

+2

Sul mio sistema, struct timeval è dichiarato con "time_t tv_sec" e "suseconds_t tv_usec". Ho avuto fortuna a stamparli con "% ld", ma non c'è garanzia. Probabilmente è più sicuro eseguire il cast molto prima della stampa. –

7

Dal struct timeval sarà dichiarato qualcosa di simile:

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

è necessario per ottenere i campi sottostanti:

printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 
printf ("%ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec); 
+0

Devi usare% 06ld - altrimenti ottieni spazi vuoti in luoghi divertenti. Inoltre, devi preoccuparti di trasmettere a lungo se usi% ld. –

+0

Se volevo assegnare l'ora del sistema a un'altra variabile, diciamo: long time speciale; c'è un modo per farlo? – user69514

+0

Dipende dalla risoluzione che si desidera. Preferisco semplicemente dichiarare la mia "struct timeval myTime;" quindi usando "memcpy (& myTime, & (usage.ru_stime), sizeof (myTime));". Quindi puoi confrontarlo con un più tardi ru_stime per ottenere una durata. – paxdiablo

1

Sì, timeval è definito come questo

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

Utilizzando

printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 

sarà sicuramente di aiuto.

1

sì è

int main(void) 
{ 
    clock_t start, stop; 
    long int x; 
    double duration; 
    static struct timeval prev; 
    struct timeval now; 

    start = clock(); // get number of ticks before loop 

    for(x = 0; x < 1000000000; x++); 
    // sleep(100); 

    stop = clock(); // get number of ticks after loop 

    // calculate time taken for loop 
    duration = (double) (stop - start)/CLOCKS_PER_SEC; 

    printf("\nThe number of seconds for loop to run was %.2lf\n", duration); 

    gettimeofday(&now, NULL); 
    prev.tv_sec = duration; 
    if (prev.tv_sec) 
    { 
     int diff = (now.tv_sec-prev.tv_sec)*1000+(now.tv_usec-prev.tv_usec)/1000; 
     printf("DIFF %d\n",diff); 
    } 

    return 0; 

} 
+2

Per la registrazione, per calcolare la variabile diff, dovresti usare la macro 'timersub()' definita in '#include '. Vedi 'man 3 timeradd'. –

+1

@HeisSpiter 'timersub' non è conforme a POSIX e quindi non è molto portatile. – nwellnhof