Córka zasnęłą i mam trochę czasu żeby popisać ...
(01-02-2012 21:30)SQ8MHI napisał(a): ... Ja myślę, że on jest po to, żeby kursantom pokazać, jak w C łatwo i prosto zrobić sobie kuku ...
Przepraszam wszystkich kursantów, że zrobiłem Wam "kuku" i serdecznie dziękuje koledze SQ8MHI za uświadomienie mi mojej ciemnoty - żałuję tylko że kolega nie wyjaśnił od razu na czym polegały błedy.
Tłumaczę na czym polegały moje błędy:
1. ten na który zwrócił uwagę SQ8MHI polegał na tym, że rozmiar tablicy powinien uwzględniać również znacznik końca tablicy - czyli jesli chcemy zapisać w nim 9-cio znakowy ciąg to rozmiar tablicy powinien wynosić 10 ( + znacznik '\0' )
2. Drugi błąd polegał na tym że index (wskaźnik) tablicy, czyli zmienna
i była typu char. Zmienna typu char może przyjmować ujemne wartości, a wskaźniki tablic nie mogą mieć wartości ujemnych.
My tu ujemnych wartości nie używamy dlatego program działa. Działa też mimo błednie podanego rozmiaru tablicy - kompilator sam powięszył jej rozmiar z 9 do 10, my tego nie widzimy ale tak jest.
Poprawnie skonstruowana funkcja
wys_freq powinna wyglądac tak:
Kod:
void wys_freq(unsigned long int xxx)
{
char freq_string[10];
freq_string[9]=0;
unsigned char i;
for(i=8; i>0; i-=1)
{
freq_string[i]=xxx%10+48;
xxx/=10;
}
freq_string[0]=xxx+48;
napis_lcd(freq_string);
}
lub tak:
Kod:
void wys_freq(unsigned long int xxx)
{
char freq_string[10];
freq_string[9]=0;
unsigned char i;
i=8;
while(i>0)
{
freq_string[i]=xxx%10+48;
xxx/=10;
i-=1;
}
freq_string[0]=xxx+48;
napis_lcd(freq_string);
}
zwróćcie uwagę na pętlę
for z pierwszego kodu i funkcję
while z drugiego kodu - robią dokładnie to samo - porównanie te pomoże Wam zrozumieć zawiłe sformułowanie
for(i=8; i>0; i-=1)
Jutro dodamy dwa przyciski które będą zmieniały częstotliwość ( na razie co 1 Hz ) - Jeśli ktoś ma pomysł jak to zrobić to prosze sie tu wykazać i podzielić z nami kodem.