Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Difftimen kanssa ongelmia C:ssä

Sivun loppuun

jeepatijee [22.12.2007 20:35:39]

#

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

hunajavohveli [22.12.2007 20:46:11]

#

http://www.cppreference.com/stddate/difftime.html
http://www.cppreference.com/stddate/localtime.html
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.

jeepatijee [22.12.2007 20:50:00]

#

Kokeilenpa tuota mktimea! Kiitos neuvosta!

jeepatijee [22.12.2007 22:09:44]

#

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?

hunajavohveli [22.12.2007 22:21:05]

#

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ä.

jeepatijee [22.12.2007 22:40:37]

#

http://www.opengroup.org/onlinepubs/009695399/functions/strptime.html

Käytän Gnu:n GCC-kääntäjää.

Legu [22.12.2007 22:55:00]

#

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);

jeepatijee [23.12.2007 09:07:27]

#

Tuhannet kiitokset! Nyt toimii! Otin vielä tosiaan nuo +1900 vuosista pois ja +1 kuukausista pois niin pelittää hyvin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta