Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Peter Fodrek 26. 07. 2021, 15:28:09
-
Milé kolegyne, vážení kolegovia!
Narazil som na neočakávané správanie sa funkcie localtime.
Doteraz som bol v tom, že localtime alokuje miesto v pamäti pre struct tm, naplní ho a vráti smerník na dáta.
Dnes sa správa tak, ako keby nealokoval nové miesto v pamäti. Vidím to, tak že mám viacero tm * a po localtime sa zmenia dátumu všade, kde používam smerník pôvodne z iných localtime v kóde.
Nezdá sa mi to ako korektné správanie sa. Ak ale je správne, tak mám otázky
1. Je lepšie alokovať pre dáta v štruktúrach, kde je tm *, pomocou malloc a kopírovať dátumové položky dátumu manuálne alebo dať do štruktúry priamo položku tm.
2. Ak je 1 závislé od použitia, tak by som rád vedel aspoň orientačne, ako je to lepšie kde?
Nechce sa mi robiť refactoring z -> na. , takže asi skúsim malloc ako prvú možnosť.
-
Ukaz kod..
-
Manuál?
https://linux.die.net/man/3/localtime (https://linux.die.net/man/3/localtime)
The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.
-
Manuál?
https://linux.die.net/man/3/localtime (https://linux.die.net/man/3/localtime)
The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.
Tým pádom mi nestačia moje okuliare (brýle) +2,0 dioptrire vodorovne a -3,5 dioptrie pod uhlom 5°
-
Ukaz kod..
Myslím, že netreba
nahradil som
vystup.odlievanieVymenik=localtime(cas);
dvoma riadkami
vystup.odlievanieVymenik=(struct tm *) malloc (sizeof (struct tm));
memcpy(vystup.odlievanieVymenik,lokalny, sizeof (struct tm));
a ide to tak, ako má
....
-
https://linux.die.net/man/3/localtime
https://www.cplusplus.com/reference/ctime/localtime/
Protože standardní localtime/gmtime/... používají nějakou vnitřní sdílenou strukturu, tak to není zrovna bezpečné
Možná je lepší se rovnou pohlédnout po jiných funkcích např localtime_r (ale jukněte do dokumentace), obzvlášť pokud jedete s více vlákny.
A k malloc není důvod, stačí normálně zkopírovat přiřazením.
struct {
struct tm time1;
struct tm time2;
} Item;
Item.time1=*localtime(&rawtime);
localtime_r(&rawtime,&Item.time2);
-
https://linux.die.net/man/3/localtime
https://www.cplusplus.com/reference/ctime/localtime/
Protože standardní localtime/gmtime/... používají nějakou vnitřní sdílenou strukturu, tak to není zrovna bezpečné
Možná je lepší se rovnou pohlédnout po jiných funkcích např localtime_r (ale jukněte do dokumentace), obzvlášť pokud jedete s více vlákny.
A k malloc není důvod, stačí normálně zkopírovat přiřazením.
struct {
struct tm time1;
struct tm time2;
} Item;
Item.time1=*localtime(&rawtime);
localtime_r(&rawtime,&Item.time2);
Vďaka.