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);
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);
Et näytä missään koodia jossa kulunut ja yhtpituus muuttujiin asetetaan arvoja.
Kiitos Metabolix, eipä tullut mieleen että "vika" olisi localtimessä.
Väsymys haittaa, nyt nukkumaan
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.