Eli olen aloitteleva ohjelmoija ja minulla on ongelma difftimen kanssa. Missä muodossa tuo difftime vaatii ne ajat, joiden erotuksen se laskee? Toisen olen määritellyt näin:
struct tm * pvm_nyt; time_t T = time(NULL); pvm_nyt = localtime(&T); //TÄMÄ OLISI SIIS AIKA OHJELMAN AJOHETKELLÄ
Toisen haen merkkijonona tiedostosta ja muutan strptime:llä aikatietueeksi (tai näin tuon strptime:n toiminnan ymmärsin):
struct tm pvm_tiedostosta; //NÄIN MÄÄRITTELIN SIIS SEN TIEDOSTOSTA HAETUN AJAN strptime(aika_tiedostosta, "%Y-%m-%d-%H-%M-%S", &pvm_tiedostosta);
Tuo 'aika_tiedostosta' on siis se tiedostosta haettu merkkijono, joka on muotoa:
%Y-%m-%d-%H-%M-%S.
Laitoin vuosien perään + 1900, jotta se näyttäisi oikeaa vuotta (eikä vuosia epochista) sekä kuukausien perään + 1, koska se vissiin muuten laskee kuukausia tammikuusta.
pvm_tiedostosta.tm_year = pvm_tiedostosta.tm_year + 1900; pvm_tiedostosta.tm_mon = pvm_tiedostosta.tm_mon + 1;
Muuttaminen vissiin onnistuu koska kääntäjä ei siitä herjaa ja kyllä ne oikein tuli ku testasin tulostelemalla ne.
Nyt kääntäjä herjaa ainoastaan difftimestä:
double aikaero; //TÄMÄN OON MÄÄRITELLY JO AIKAISEMMIN aikaero = difftime(pvm_nyt, pvm_tiedostosta); //TÄSSÄ SIIS KOSAHTAA
http://www.cppreference.com/stddate/difftime.
http://www.cppreference.com/stddate/localtime.
http://www.cppreference.com/stddate/mktime.html
Noiden mukaan difftime vaatii parametrit time_t-tyyppisinä. Funktio localtime taas näkyisi palauttavan osoittimen tm-tyyppiseen tietueeseen. Tuon mukaan mktime-funktiolla voisi konvertoida tm-tietueen time_t:ksi, jonka jälkeen sen voi antaa difftimelle.
Kokeilenpa tuota mktimea! Kiitos neuvosta!
Näyttäs, että tuota mktimea varten tuo muuttujan 'pvm_tiedostosta' määrittelyn pitäsi mennä näin:
struct tm * pvm_tiedostosta;
Ja mullahan se on:
struct tm pvm_tiedostosta;
Jos laitan tuon tähden sinne niin tuo strptime ei enää toimi. Eli onko olemassa muita funktioita tai tapoja muuttaa merkkijono (stringi) joksikin aikatyypiksi?
Missä ja miten strptime on määritelty? C/C++ Reference ainakaan ei tunne kyseistä funktiota, mutta kolmannen parametrin on ilmeisesti tarkoitus olla osoitin tm-tietueeseen. Jos muutat määrittelysi suoraan osoittimeksi (struct tm * pvm_tiedostosta;), sinun pitää vastaavasti poistaa osoiteoperaattori & parametrin edestä.
http://www.opengroup.org/onlinepubs/009695399/
Käytän Gnu:n GCC-kääntäjää.
Tähän tapaan:
struct tm aika_tiedostosta; strptime(tiedostosta_luettu_aika, "%Y-%m-%d-%H-%M-%S", &aika_tiedostosta); // kun kerran tiedostossa on sekunteihin asti ja time() antaa sekuntien tarkkuudella // niin liukulukua ei tarvita, vaan tulos on varmasti kokonaisluku int aikaero = difftime(time(NULL), mktime(&aika_tiedostosta)); printf("Aikaero: %d sekuntia.\n", aikaero);
Tuhannet kiitokset! Nyt toimii! Otin vielä tosiaan nuo +1900 vuosista pois ja +1 kuukausista pois niin pelittää hyvin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.