Gå til innhold

localtime() problem


Anbefalte innlegg

Hei,

 

Jeg lager et program i studiesammenheng, men det har oppstått er merkelig problem.

 

Når jeg bruker localtime() i programmet, slutter en annen del å virke!

 

Her er scenario:

 

struct melding {
   struct tm * timestamp;
};

...

time_t now;
now = time(0) // testet også med time(&now)
nyMelding->timestamp = localtime(&now)

-----------------------
På en helt annen del av programmet, nemlig kommandoløkken min, oppstår følgende problem etter koen over er kjørt.

Jeg skriver en kommando, feks: "list meldinger"

kommandoløkken deler input opp i biter(list + meldinger)

som debug info skriver jeg ut input jeg skriver inn, og input som er i char *arr[] som nå inneholder list + meldinger.

Programmet gjenkjenner min "list meldinger", men i arrayen blir det nå plutselig:
"list123j12"
"meldinger!"#ds3"
"(null)"

null skal være der, men nå har mange merkelige tegn kommet.

Før jeg implementerte localtime() funket alt som det skulle.

 

Jeg har søkt gjennom x antall sider på nettet og gransket man localtime, men eneste jeg får opp er problemer ved multi-threading (som programmet mitt ikke har). Jeg prøvde for sikkerhets skyld å bruke localtime_r(), uten hell. Samme problem.

 

Jeg har utsatt å legge til denne funksjonen en stund, siden jeg trodde det ikke var så ille, men nå er jeg altså fast og kommer ingen vei :(

 

Håper noen har opplevd samme problem og/eller har en løsning! :)

Lenke til kommentar
Videoannonse
Annonse

Umulig å si uten at du legger ved kompilerbar kildekode hvor problemet kan gjennskapes.

 

Desverre har jeg ikke muligheten til dette..

 

Høres ut som du skriver over et minneområde. Det jeg tipper skjer, er at teksten er for liten til å takle det du skriver inn, så det dkriver over timestampen. Når du etterpå skriver over timestampen, vil denne synes i teksten som merkelige tegn.

 

Jeg tenkte det samme, men char *input er allokert med 200 plasser allerede. Det kan vel ikke skje da? (malloc(sizeof(char) * 200))

Lenke til kommentar

Dersom du ikke kan poste mer kode, så er eneste måten å prøve å isolere problemet ditt. Lag en liten versjon av prosjektet ditt som implementerer et minimum av funksjonalitet (f.eks kun user input og kun localtime delen).

 

Som GG sier, ser dette veldig ut som en buffer overflow. Husk at denne typen feil kan manifistere seg en helt annen plass enn der feilen faktisk ligger.

Lenke til kommentar

Jeg tenkte det samme, men char *input er allokert med 200 plasser allerede. Det kan vel ikke skje da? (malloc(sizeof(char) * 200))

 

Med så lite kode postet så blir det bare skudd i mørke.

 

Det du viser er et array med 3 pekere til strenger, så 200 burde nok holde, men du sier ikke hvordan du allokerer minne som disse pekerene peker på. Det er nok her problemet ligger.

 

Er den kodebiten du viser en funksjon? Du har ikke problemer med at data som er allokert på stack'en i funksjonen din blir gjenbrukt nå neste funksjon kalles?

 

Hva om du heller lagrer timestamp struct'en direkte i meldingen slik:

 

  struct melding {
   struct tm timestamp;
 };

 struct melding nyMelding;

 time_t now;
 now = time(0); // testet også med time(&now)

 localtime_r(&now,&nyMelding.timestamp);

 

Hvis det oppfører seg annerledes kan det tyde at du søler med minne på stack'en. Men igjen, det blir bare skudd i mørket med så lite publisert kode.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...