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.