Ei nyt oikein sytytä, eli pitäisi pieni funktio tehdä erääseen ohjelmaan joka funktion saatua kutsun(esim. parametrina 1) aloittaa ajan laskemisen ja funktion saatua kutsun(esim. parametrina 0) palauttaa kuluneen ajan. Ohessa vielä koodintynkää joka ei siis toimi oikein. Mikähän tuossakin mättää?
// Jos start==1 suoritus alkaa, jos start==0 //suoritus päättyy.
int TimeCount(int start) {
// Tämän lohkon suorittamiseen menee aikaa 8 kellojaksoa == 1us.
while(start != 0) {
printf("yksi");
printf("kaksi");
printf("kolme");
printf("neljä");
time ;
if(start == 0) {
break;
}
}
return time;
}
// Jos start==1 suoritus alkaa, jos start==0 //suoritus päättyy.
int TimeCount(int start) {
// Tämän lohkon suorittamiseen menee aikaa 8 kellojaksoa == 1us.
while(start != 0) {
printf("yksi");
printf("kaksi");
printf("kolme");
printf("neljä");
time ;
if(start == 0) {
break;
}
}
return time;
}
Vastaukset 6
Vanhimmat
Eikös tuossa olennainen ongelma ole että oletetaan toisen funktiokutsun kohdistuvan samaan koodin kuin edellinen kutsu. Eli kutsutaan TimeCount(1), ajan lasku alkaa...kutsutaan TimeCount(0) ja oletetaan että kutsu kohdistuu ensimmäiseen funktioon. Todellisuudessahan ensimmäinen funktion luuppi jää kiertämään ikuisesti ja toisen kutsun luuppi ei edes aloita.
kutsut tuota funktiota jostain muualta, niin jokaisella kutsulla on omat tietonsa pinossa vai onko ihan oma kopio tästä funktiosta muistissa.
Eli kun kutsut funktiota ensin vaikka ykkösellä, niin se pyörii ikuisesti. Sitten kun kutsut nollalla, niin se päättyy heti. Tämä sen takia, että start-muuttujan sijainti on molemmille kutsuille omansa.
Tätä voit kiertää määrittelemällä globaalin muuttujan, joka on kaikkialla voimassa ja kaikille sama, tai sitten antamalla funktiolle muistiosoitteen, jossa se int-arvo on.
Sitten kun sen muistiosoitteen sisältö muuttuu vaikka pääohjelmassa, niin myös tuo funktio saa sen muuttuneen arvon.
Tuon globaalin muuttujan olen jo määritellyt, mutta se jää siihen TimeCount-funktioon, niin eihän sitä globaalin muuttujan arvoa voi muuttaa koska ei päästä alemmalle koodiriville jossa voitaisiin muuttaa start-muuttujan arvo 0:si. Olisikohan tähän jotain helpompaa/järkevämpää tapaa toteuttaa kyseisentapainen funktio. Funktion tulisi siis olla kuin sekkari; ajanlasku alkaa ja palauttaa kuluneen ajan kun ajanlasku lopetetaan.
Vaihtoehtoinen tapa:
/* globaali muuttuja, oletetaan vaikka int-tyyppinen tietotyyppi ajan tallennukseen */
int aika;
void aloita(void) {
aika = haeaikajostain();
}
int lopeta(void) {
return (haeaikajostain()-aika);
}
int main(..) {
int a;
aloita();
teejotain..
a = lopeta();
return 0;
}
Lisäksi mainittakoon, ettet oikein voi päätellä koodia katsomalla miten kauan sen ajo kestää.
#include
#include
int main(int argc, char *argv[]) {
clock_t startvalue = 0, endvalue = 0;
unsigned int i = 0;
startvalue = clock();
for(i = 0; i < 100000000; i++);
endvalue = clock();
printf("Ero %.2fs\n", ((float)endvalue - startvalue) / CLOCKS_PER_SEC);
return 0;
}
Ohjelma on tehty Linux-ympäristössä.. Toiminee myös Windowsissa.
Jos sulautettuja järjestelmiä koodaa niin tekisin jotain tälläistä.. kellokeyskeytys() funktio ajetaan automaattisesti, kun kellokeskeytys tulee.
unsigned char timeri = 0;
void kellokeskeytys(void) {
if(++timeri == HALUTTUARVO) {
timeri = 0;
lippu = true;
}
}
void main(void) {
alusta_keskeytykset();
while(1) { // pääsilmukka
if(lippu) {
lippu = false
tee_jotain();
}
}
}
mutta jos on tarkoitus laskea kellonaika kahden tapahtuman välillä ja täydet sekuntit riitää vastaukseksi, niin eikö voisi käyttää difftime-funktiota ajankulun laskentaan? Ohessa helpistä kopioitu ja muokattu difftime-funktion esim. koodi.
#include
#include
#include
#include
int main(void)
{
time_t first, second;
printf ("Ajan mittaus alkaa kun painat jotain\n");
getch();
first = time(NULL); /* Gets system time */
printf("Ajan mittaus päätty kun painat jotain\n");
getch();
second = time(NULL); /* Gets system time again */
printf("The difference is: %.0f seconds\n",difftime(second,first));
getch();
return 0;
}