|
[ damir0205 @ 29.09.2005. 17:50 ] @
| Pisem program koji bi trebao odredjivati razliku izmedju dva realna vremena, gdje
je pocetno vrijeme zadano ram_satima, ram_minutama i ram_sekundama konacno vrijeme bi trebali biti sati, minute i sekunde, a njihovu razliku bi trebalo prikazati u varijablama stop_sati, stop_minute i stop_sekunde. Navedena funkcija mi ne radi, pa ako neko zna, bio bih zahvalan na pomoci?
void proracun_stoperice_nakon_reseta(void)
{ unsigned char sati, minute, sekunde, stop_sati, stop_minute, stop_sekunde, ram_sati, ram_minute, ram_sekunde;
unsigned long int sekunde_poc, sekunde_pow_on, razlika;
sekunde_poc = ram_sati*3600 + ram_minute*60 + ram_sekunde;
sekunde_pow_on = sati*3600 + minute*60 +sekunde;
if(sekunde_pow_on<sekunde_poc)
{sekunde_pow_on=sekunde_pow_on + 86400;}
stop_sati= (sekunde_pow_on - sekunde_poc)/3600;
stop_minute=( sekunde_pow_on - sekunde_poc-sati*3600)/60;
stop_sekunde= sekunde_pow_on - sekunde_poc- sati*60 - minute*60;
} |
[ NrmMyth @ 29.09.2005. 21:36 ] @
Mislim da ce ti ovo koristiti.
time.h
[ dejandj @ 30.09.2005. 08:09 ] @
Citat: NrmMyth: Mislim da ce ti ovo koristiti.
time.h
Isto to, samo "lepse":
http://www.cplusplus.com/ref/ctime/difftime.html
[ damir0205 @ 01.10.2005. 14:04 ] @
Hvala na pomoci, riješio problem sa navedenom funkcijom. Da li mi netko može reči zašto stvar ne radi dobro ako su sati, minute, sekunde, ram_sati, ram_minute i ram_sekunde varijable tipa unsigned char i ako njihova vrijednost nikad nije veća od 60 sigurno?
void proracun_stoperice(void)
{unsigned long int dan_utj, sati, minute, sekunde, ram_sati, ram_minute, ram_sekunde, proteklo_vrijeme, sekunde_real_time, sekunde_start_time, sekunde_dana, stop_minute, stop_sekunde, stop_sati;
read_time_and_date(); //funkcija koja čita sate, minute i sekunde iz PCF8583
sekunde_dana = dan_utj*86400;
sekunde_real_time = sati*3600 + minute*60 + sekunde;
sekunde_start_time = ram_sati*3600 + ram_minute*60 + ram_sekunde;
proteklo_vrijeme = sekunde_dana + sekunde_real_time - sekunde_start_time;
stop_sati = (proteklo_vrijeme/3600);
stop_minute = ((proteklo_vrijeme - (stop_sati*3600))/60);
stop_sekunde = (proteklo_vrijeme - (stop_sati*3600) - (stop_minute*60));
}
[Ovu poruku je menjao damir0205 dana 01.10.2005. u 15:08 GMT+1]
[ NrmMyth @ 01.10.2005. 14:33 ] @
Jeli mozes locirati gresku?
[ dejandj @ 01.10.2005. 16:04 ] @
Iz "dosta prostog" razloga...
Tvoja specifikacija NIJE u skladu sa standardom jer "stanadard" uzima u obzir ineke "sitnice" koje ti ni u snu NISI imao u vidokrugu...
Ovo NE znaci suprotno, na zalost!
Ima razloga za 61 sekundu npr...
A ima i ludjih sistema merenja vremena!
Sve, se, na kraju, svodi na "nulu" tj tzv. "nulto" vreme...
Tu ima gadnih problema...
Nula u principu oznacava nista i postavlja se sustinsko pitanje, da li je nula "broj"? Iako je jasno da nije, broj nicega je strasno "ozbiljan", komjuterasi su odlucili da ON bude "nesto", obicno, jedan, tj "kec"...
E sad kad(???) vreme pocinje?
To, em niko nezna, em ne ume da objasni...
Kako meriti "razliku" tako neceg?
[Ovu poruku je menjao dejandj dana 01.10.2005. u 17:18 GMT+1]
[ damir0205 @ 01.10.2005. 17:17 ] @
Evo ovako otprilike. Cijeli program služi kao štoperica i napisan je za mikrokontroler. Podatak o trenutnom vremenu dobiva se iz satnog čipa, a mjerenje vremena počinje pritiskom tipke START.........., da dalje ne objašnjavam jer mislim da nije bitno. Ova druga funkcija koju sam napisao radi bez greške takva kakva je i cijeli program mi radi ok, ali nije ispravno izračunavao sljedeči izraz dok su sati, minute i sekunde bile deklarirane kao unsigned char varijable.
@dejandj
Tvoja specifikacija NIJE u skladu sa standardom jer "stanadard" uzima u obzir ineke "sitnice" koje ti ni u snu NISI imao u vidokrugu...
@dejandj Standard?
sekunde_real_time = sati*3600 + minute*60 + sekunde;
Zašto?
[Ovu poruku je menjao damir0205 dana 01.10.2005. u 18:36 GMT+1]
[ NrmMyth @ 01.10.2005. 20:06 ] @
Jesi prosao sa debuggerom tu funkciju?
[ dejandj @ 02.10.2005. 12:31 ] @
tm struktura i one funkcije za vreme su ANSI standard...
Taj, zadnji, "unsigned char" ne figurira u standardu.
[Ovu poruku je menjao dejandj dana 02.10.2005. u 13:32 GMT+1]
[ idb @ 03.10.2005. 16:02 ] @
Bez ulaska u to sta tvoj kod radi, mislim da nesto nisi inicijalizovao, ili si pregazio spoljasnje promenljive ....
Pogledaj tvoj kod malo prepakovan....
Code:
void proracun_stoperice(void){
unsigned long int dan_utj, // !!! Nije inicijalizovane !!!
sati, minute, sekunde, // !!! Nisu inicijalizovane !!!
ram_sati, ram_minute, ram_sekunde, // !!! Nisu inicijalizovane !!!
proteklo_vrijeme, // !!! Nije inicijalizovane !!!
sekunde_real_time, // !!! Nisu inicijalizovane !!!
sekunde_start_time, sekunde_dana, // !!! Nisu inicijalizovane !!!
stop_minute, stop_sekunde, stop_sati;
read_time_and_date();
sekunde_dana = dan_utj*86400;
//Sta ce sada bit: sati=?, minute=?, sekunde=? ...
sekunde_real_time = sati*3600 + minute*60 + sekunde;
//Sta ce sada bit: ram_sati=?, ram_minute=?, ram_sekunde=? ...
sekunde_start_time = ram_sati*3600 + ram_minute*60 + ram_sekunde;
// ....
proteklo_vrijeme = sekunde_dana + sekunde_real_time - sekunde_start_time;
stop_sati = (proteklo_vrijeme/3600);
stop_minute = ((proteklo_vrijeme - (stop_sati*3600))/60);
stop_sekunde = ((proteklo_vrijeme - (stop_sati*3600) - (stop_minute*60));
}
[Ovu poruku je menjao idb dana 03.10.2005. u 17:03 GMT+1]
[ damir0205 @ 03.10.2005. 19:19 ] @
Nije stvar u inicijalizaciji. Sati, minute i sekunde predstavljaju podatak o trenutnom vremenu i dobivaju se iz satnog čipa svaki put kad se izvrši program, a to se otprilike dogadja svakih 10ms. ram_sati i ram_minute i ram_sekunde je vrijeme u koje je pritisnuta tipka start i oni su konstanta sve dok se traje mjerenje. Mjerenje je u redu za sve vrijednosti sati osim ako sati nisu 11 ili 21 (znači program uredno broji stop_sate, stop_minute i stop_sekunde sve do jedne od tih vrijednosti). Za te vrijednosti sati (ako su sati unsigned char) proteklo_vrijeme mi ispada neki jako veliki broj, koji ni približno ne odgovara stvarnoj situaciji. Mislim da je stvar u kompajleru, posavjetovao sam se s kolegama s posla i oni misle tako. Nek me netko razuvjeri ako nije istina.
[Ovu poruku je menjao damir0205 dana 03.10.2005. u 20:22 GMT+1]
[ idb @ 04.10.2005. 09:13 ] @
Citat: Mislim da je stvar u kompajleru Mozda ti probleme pravi i kompajler, ali pogledaj ponovo funkciju void proracun_stoperice(void).
Sve promenljive koje se u njoj pojavljuju su lokalne. Sva racunanja koja izvrsis ce biti lokalnog karaktera i ostace zarobljena unutar funkcije, bez obzira ako istoimene promenljive imas i na globalnom nivou.
Neke izmene bi eventualno mogla izvrsiti funkcija read_time_and_date() - ne znam sta ona radi ...
[ damir0205 @ 05.10.2005. 16:28 ] @
Sve varijable su globalne, jedina greska je sto sam ih u ovoj funkciji, prikazao kao lokalne, samo da se vidi kojeg su tipa. To je jedina razlika izmedju strvarnosti i ove funkcije koju sam stavio na forum. Po takvom tumacenju mogla bi bilo koja od dvadesetak funkcija raditi probleme, ali poprilicno sam siguran da to u ovom slucaju nije istina. Oprostite sto sam krivo prikazao deklaraciju varijabli.....
[ nikoladsp @ 12.10.2005. 17:16 ] @
ako si u prilici koristi windows-ov multimedija tajmer.ako ne onda ko sto ti rekose ljudi u prethodnim postovima:procackaj <time.h>
[Ovu poruku je menjao nikoladsp dana 12.10.2005. u 18:17 GMT+1]
[ dejandj @ 13.10.2005. 14:23 ] @
Ajd jos jednom...
Imas u "mom topicu" zvanom "problemi sa vremenom", funkcionalan win/ansi_C kod za operacije sa vremenom...
Nije problem da dodas ovu razliku u vremenu osim ako te interesuju delovi sekunde i nano sekunde ali moze cak i to! Trik je u tome sto su sekunde jedinice vremena po standardu...
Nije problem da te sekunde pretvoris u sta ti drago!
Ovaj deo je samo stvar prezentacije.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|