localtime a (ne)tvorba nových dát v pamäti

localtime a (ne)tvorba nových dát v pamäti
« kdy: 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ť.




Re:localtime a (ne)tvorba nových dát v pamäti
« Odpověď #1 kdy: 26. 07. 2021, 15:37:18 »
Ukaz kod..

CFM

Re:localtime a (ne)tvorba nových dát v pamäti
« Odpověď #2 kdy: 26. 07. 2021, 16:01:25 »
Manuál?
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.

Re:localtime a (ne)tvorba nových dát v pamäti
« Odpověď #3 kdy: 26. 07. 2021, 16:25:35 »
Manuál?
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°

Re:localtime a (ne)tvorba nových dát v pamäti
« Odpověď #4 kdy: 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á


....


Re:localtime a (ne)tvorba nových dát v pamäti
« Odpověď #5 kdy: 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);


Re:localtime a (ne)tvorba nových dát v pamäti
« Odpověď #6 kdy: 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.