Newsgroup: it.comp.lang.c
Titolo: gmtime_r

salve a tutti.
dovrei usare la funzione gmtime_r al posto di gmtime per evitare i
problemi di sovrascrittura,
ma se provo a compilare il seguente esempio:
#include <time.h>
#include <stdio.h>
void main()
{
char strtime[100];
struct tm *data;
time_t tms;
time(&tms);
gmtime_r(&tms,data);
strftime(strtime, 100,"%Y.%m.%d.%H%M%S",data);
printf("\n %s",strtime);
}
il compilatore (uso dev-c++ su winxp) mi da il seguente errore:
[Linker error] undefined reference to `gmtime_r'
in alternativa riesco a compilare il codice con gmtime:
#include <time.h>
#include <stdio.h>
void main()
{
char strtime[100];
struct tm *data;
time_t tms;
time(&tms);
data=gmtime(&tms);
strftime(strtime, 100,"%Y.%m.%d.%H%M%S",data);
printf("\n %s",strtime);
}
usando la struttura data forse riesco ad evitare i problemi di
sovrascrittura?
naturalmente il problema della data non corretta si presenta
casualmente con un codice molto più complicato.

 
Nell'esempio riportato non ti dara` problemi in quanto usi il risultato 
immediatamente.  In un codice complesso successive chiamate a gmtime() 
riaggiornano il buffer interno quindi avrai sempre l'ultima data.
gmtime_r() ha lo scopo di mettere il risultato in buffer diversi che 
devono essere passati ogni volta.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

gmtime_r(&tms,data);
Occhio: 'data' non č inizializzato...

 per avere l'equivalente della gmtime_r() della libreria.
Due note:
* gmtime può restituire NULL...
* non è equivalente a gmtime_r (come defininita nella SUS - non è ISO)
  la versione _r() è thread safe (e l'uso di un buffer esterno e
  fondamentale). La tua versione non è safe.
Luca
-- 
Home: 
http://kronoz.cjb.net
"In linea di principio sarei indifferente al natale, se solo il natale
 ricambiasse la cortesia e mi lasciasse in pace." -- Marco d'Itri

 fondamentale). La tua versione non è safe.
In generale hai ragione. Nel particolare caso di una specifica piattaforma, 
la sua funzione sarà thread-safe se 'gmtime' è, a sua volta, thread-safe. E 
alcune implementazioni lo sono, in effetti, perché impiegano uno storage 
thread-specific anziché una variabile globale. (Un po' come avviene, credo 
ormai ovunque, con 'errno'.)
Max

grazie per i consigli.
il codice non veniva compilato perchè gmtime_r non era in libreria.
ho compilato correttamente il codice su una macchina linux.
#include <time.h>
#include <stdio.h>
void main()
{
char strtime[100];
struct tm data;
time_t tms;
time(&tms);
gmtime_r(&tms,&data);
strftime(strtime, 100,"%Y.%m.%d.%H%M%S",&data);
printf("\n %s\n",strtime);
}
ma, sempre con il codice più complicato, ricevo il seguente errore:
*** FATAL ERROR
  CPU   : 13644 : [nome del processo]
  Class : 0x00000004 : eclSYSTEM: System error.
  Error : 0x00005008 : errSIGSEGV: Segment violation
  Near  : ""
  Object: ""
  Thread: 0x0x82d5d00 : "DataManager"  "DataManager"
Program aborted.
DataManager è il nome del file cpp modificato con la gmtime_r al posto
di gmtime.
l'errore potrebbe essere stato causato dall'uso di gmtime_r?

 }
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 > }
se compilo mi da il seguente errore:
gmtimer.cpp: In function `tm *gmtime_r (const time_t *, tm *)':
gmtimer.cpp:7: cannot convert `void *' to `tm *' in return
devo modificarla così:
struct tm *gmtime_r(const time_t *timep, struct tm *result)
{
        memcpy(result, gmtime(timep), sizeof(struct tm));
        return result;
}
non ho ancora testato nel codice datamanager il problema del segment
violation

 gmtimer.cpp:7: cannot convert `void *' to `tm *' in return
Perché stai compilando codice C++, non C.  In C++ il cast nella
trasformazione da void* a T* è obbligatorio, in C è superfluo.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it