Ajastin C:llä

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;

}
6662
Äänestä

Muut lukivat myös

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.

Äänestä

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.

Äänestä
  • 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.

    Äänestä

  • Maze kirjoitti:

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

    Äänestä

#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();
}
}
}

Äänestä

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

Äänestä

Kommentoi aloitusta


Maze kirjoitti:

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;

}

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu