Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Kaksi strftime-riviä, aina sama tulos

gamehouse [17.02.2013 23:35:09]

#

Mikä tässä voi olla vialla? Jos yritän tulostaa molempia arvoja, ne ovat samat, mutta jos lasken ja tulostan vain toisen, kaikki toimii niinkuin pitääkin ja ne ovat toisistaan eroavat arvot.
Olenko vain väsynyt ja en huomaa jotain selvää, vai mikä tässä nyt on väärin?

int sijainti = BASS_ChannelGetPosition(kahva,BASS_POS_BYTE);
double sijainti_sek_yht = BASS_ChannelBytes2Seconds(kahva,sijainti);

struct tm *kulunut_tm;
struct tm *yhtpituus_tm;
char kulunut[10];
char yhtpituus[10];

time_t aika_kulunut = (time_t)sijainti_sek_yht;
time_t aika_yhtpituus = (time_t)pituus_sek;
kulunut_tm = localtime(&aika_kulunut);
yhtpituus_tm = localtime(&aika_yhtpituus);

strftime(kulunut,10,"%M:%S",kulunut_tm);
strftime(yhtpituus,10,"%M:%S",yhtpituus_tm);

mvprintw(maxy-1,21,"%s / %s",kulunut,yhtpituus);

Metabolix [18.02.2013 00:06:51]

#

Kuten localtime-funktion ohjeissa varsin selvästi sanotaan, funktio palauttaa osoittimen sisäiseen muuttujaansa, jonka arvo ylikirjoitetaan joka kutsukerralla. Kyseessä on kyllä poikkeuksellisen typerä suunnitteluratkaisu mutta kuitenkin ihan tunnettu ja dokumentoitu juttu.

Yksinkertaisinta on vain kopioida tulos heti:

// Ei osoittimia!
struct tm a_tm, b_tm;

// *-merkki ennen localtimea, ei haluta osoitinta vaan sisältö.
a_tm = *localtime(&a_aika);
b_tm = *localtime(&b_aika);

// &-merkki ennen tm-rakenteita, tarvitaan taas osoitin.
strftime(a_teksti, 10, "%M:%S", &a_tm);
strftime(b_teksti, 10, "%M:%S", &b_tm);

User137 [18.02.2013 00:10:13]

#

Et näytä missään koodia jossa kulunut ja yhtpituus muuttujiin asetetaan arvoja.

gamehouse [18.02.2013 00:14:23]

#

Kiitos Metabolix, eipä tullut mieleen että "vika" olisi localtimessä.
Väsymys haittaa, nyt nukkumaan

Metabolix [18.02.2013 02:07:41]

#

gamehouse: Onkohan nyt tosiaan niin, että koodisi on tarkoitus vain muuttaa luku minuuteiksi ja sekunneiksi? Siinä tapauksessa olet kyllä ihan pihalla: localtime on aivan väärä funktio ja tuottaa eräillä aikavyöhykkeillä puoli tuntia väärän tuloksen; gmtime toimisi oikein muttei sekään ole järkevä tapa. Minuuttimuunnoksen voi tehdä helposti jakolaskulla ja jakojäännöksellä.

sprintf(teksti, "%02d:%02d", sekunnit / 60, sekunnit % 60);

User137, tekstit asetetaan juurikin strftime-funktiolla ja tässä jälkimmäisessä koodissani sprintf-funktiolla.

Vastaus

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

Tietoa sivustosta