Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Peter Fodrek 26. 07. 2021, 15:28:09

Název: localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: 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ť.


Název: Re:localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: IDontCare 26. 07. 2021, 15:37:18
Ukaz kod..
Název: Re:localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: MartinCFM 26. 07. 2021, 16:01:25
Manuál?
https://linux.die.net/man/3/localtime (https://linux.die.net/man/3/localtime)

Citace
The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions.
Název: Re:localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: Peter Fodrek 26. 07. 2021, 16:25:35
Manuál?
https://linux.die.net/man/3/localtime (https://linux.die.net/man/3/localtime)

Citace
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°
Název: Re:localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: Peter Fodrek 26. 07. 2021, 16:30:18
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á


....
Název: Re:localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: Ovrscout 26. 07. 2021, 19:20:07
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.
Kód: [Vybrat]
struct {
  struct tm time1; 
  struct tm time2;
} Item;
Item.time1=*localtime(&rawtime);
localtime_r(&rawtime,&Item.time2);

Název: Re:localtime a (ne)tvorba nových dát v pamäti
Přispěvatel: Peter Fodrek 27. 07. 2021, 12:26:50
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.
Kód: [Vybrat]
struct {
  struct tm time1; 
  struct tm time2;
} Item;
Item.time1=*localtime(&rawtime);
localtime_r(&rawtime,&Item.time2);


Vďaka.