Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C - Wprowadzenie


Autor: Dondu

Niniejszy kurs języka C rozpoczniemy od poznania kilku podstawowych elementów, które umożliwią Ci wykorzystanie do nauki załączonego kompilatora CManiak.


Bez tej wiedzy nie zaczynaj
nauki języka C
w kursie na blogu !
.. . no chyba, że lubisz się męczyć.

Każdy przykład znajdziesz pod odpowiednim numerem w kompilatorze CManiak.


Pierwszy program.

Każdy program w języku C rozpoczyna się od wywołania funkcji main() i kończy na return 0:

Przykład 1:
main(){
    return 0;
}
Ale żeby być zgodnym ze standardem kod powinien wyglądać tak:
int main(void){
    return 0;
}
Powyższy program uruchomi się i od razu zakończy.

Pamiętaj!
Aby skompilować program, jego kod musi być zawarty w funkcji main()
Piszę o tym na czerwono, ponieważ wiele osób kopiuje ręcznie fragmenty programów, umieszczając je w kompilatorze bez niezbędnego otoczenia w postaci funkcji main() dziwiąc się, czemu kompilator wykazuje błędy podczas kompilacji.

Zobacz przykładowe kody w zakładce Przykłady kompilatora.

Dodatkowo możesz definiować funkcje.



Hello world!
W kursie bardzo często będziemy wykorzystywać terminal kompilatora (zakładka Terminal) jako ekran do pokazywania wyników pracy programu. Wykorzystamy do tego poniższe funkcje, ale najpierw poznasz dyrektywę:

#include
Żeby korzystać z dostępnych funkcji musimy powiadomić kompilator gdzie się one znajdują. Służy do tego właśnie dyrektywa #include, po której podajemy linkowany (załączany) plik nagłówkowy (przykłady poniżej).

Czas na funkcje:

putchar(x)
nagłówek: <stdio.h>
Umieszcza w terminalu znak ASCII o kodzie x.


Przykład 2:
To spróbujmy wydrukować dużą literkę A (kod ASCII: 65):
#include <stdio.h>

int main(void){
    putchar(65);  //65 w kodzie ASCII to duża literka A
    return 0;
}


printf()
nagłówek <stdio.h>
Umieszcza w terminalu sformatowany ciąg znaków. Ta funkcja ma spore możliwości, ale teraz poznasz tylko tyle ile trzeba do niniejszego kursu języka C.

Przykład 3:
#include <stdio.h>

int main(void)
{
  printf("Hello World!"); //pisz w terminalu (ekranie)
  
  //printf("Oj! Coś nie tak!"); //usuń znaki komentarza przed printf 
                                //i zobacz co się stanie
  return 0;
}
Pierwszy printf() ładnie wydrukował napis Hello World! Po usunięciu znaków komentarza na początku drugiego printf(), niektórzy spodziewali się, że po oba napisy będą jeden pod drugim. Tymczasem zostały wydrukowane jeden za drugim, w dodatku bez spacji. Zastosujemy więc znak specjalny:

\n
czyli żądanie przejścia do nowej linii:

Przykład 4:
Wykonanie dwóch printf() jednego po drugim, ale ze znakiem \n:
  printf("Hello World!\n");
  printf("Teraz piszę w nowej linii.");

Przykład 5:
Znak \n można umieścić w dowolnym miejscu napisu, co spowoduje jego podział na linie:
  printf("Hello World!\nTeraz piszę w nowej linii.");
}

Wyświetlanie liczb
Teraz niezbędna wiedza o wyświetlaniu liczb za pomocą printf().Funkcja ta ma bardzo duże możliwości formatowania wyświetlanych danych liczbowych. Używa do tego symboli formatowania.  Na razie poznasz tylko kilka z nich:

%d - liczba całkowita ze znakiem
%f - liczba zmiennoprzecinkowa ze znakiem
%x - szesnastkowa bez znaku

Przykład 6:
Zauważ, że w przykładzie dodałem znak specjalny \n , by wymusić nową linię:
printf("%d", 23);      //dziesiętna całkowita ze znakiem
printf("\n%f", -1.23); //zmiennoprzecinkowa ze znakiem
printf("\n%x", 255);   //w kodzie szestnastkowym


Dane tekstowe
Podobnie jest z danymi w postaci znaków ASCII. By je wyświetlić za pomocą printf(), użyjemy:
%c - pojedynczy znak
%s - łańcuch znaków

Przykład 7:
  printf("%c", 65);   //wyświetla znak ASCII o kodzie 65
  printf("\n%s", "bardzo"); //wyświetla łańcuch znaków
Jak widzisz printf("%c", 65) odpowiada opisanej wcześniej putchar(65).


Przykład 8:
A teraz zmienimy nieco drugi printf() z przykładu powyżej, na następujący:
  printf("CManiak jest%s fajny!", " bardzo");
Czary mary i otrzymujemy napis: CManiak jest bardzo fajny!
Ale jak to się stało? Ponieważ printf() podstawia pod symbole formatowania następujące po sobie argumenty.


Przykład 9:
Argumentów może być więcej, a oddziela się je przecinkami:
printf("%s ma %d braci o łącznej wadze %f kg.", "Michał", 3, 201.45);
Printf() po kolei od lewej strony analizował pierwszy argument którym jest "%s ma %d braci o łącznej wadze %f kg." i odnajdując znaki specjalne podstawiał kolejne argumenty oddzielone przecinkami.

Czyli symbolom znalezionym w pierwszym argumencie printf() przypisał odpowiednio:
%s - napis Michał
%d - liczbę 3
%f - liczbę 201.45
odpowiednio je formatując w zależności od symbolu formatowania, co opisałem wcześniej.


Więcej informacji na temat printf( ) znajdziesz tutaj: Rodzina instrukcji printf( )



Zanim przejdziesz do dalszych części kursu opanuj dobrze powyższą wiedzę oraz obsługę kompilatora CManiak.

1
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

32 komentarze:

  1. No to zaczynamy. Skąd mam wiedzieć kiedy użyć jakiego include? Skąd mam wiedzieć że to ma być:
    #include
    czy może i co one poszczególne oznaczają?

    Wyjaśnij dokładnie co znaczy poniższe?
    int main(void)

    Zgaduję żę int main to initial main ? Ale po co w nawiasie (void) ? co to oznacza i dlaczego void a nie cokolwiek innego?

    OdpowiedzUsuń
    Odpowiedzi
    1. int oznacza typ argumentu, który ma być zwracany. W tym przypadku zwróci liczbę całkowitą. Gdy nie chcemy, aby funkcja cokolwiek zwracała używamy void. Z tego względu też jest w nawiasie void - nie pobieramy żadnych parametrów wejściowych. Można zostawić sam nawias "()" i domyślnie będzie w środku void.

      Usuń
    2. cyt. "Można zostawić sam nawias "()" i domyślnie będzie w środku void"

      ... jednak warto się trzymać standardu:

      5.1.2.2.1 Program startup
      1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
      int main(void) { }


      C - Internationa standard ISO/IEC 9899:201x

      Usuń
  2. Ten artykuł powstał po to, by wytłumaczyć tylko to, co jest niezbędne, by można było korzystać z pozostałych artykułów kurcu: Kursi C - Spis treści.

    Dlatego nie wszystko dogłębnie jest wytłumaczone w tym miejscu. Po prostu nie zastanawiaj się nad tym tylko korzystaj z artykułów kursu i znajdujących się w nich przykładach w kompilatorze CManiak, a wiele się wyjaśni z tych pytań, które zadałeś.

    Artykuł o funkcjach jest w trakcie pisania i nie ma go jeszcze w spisie treści, więc jeżeli chcesz już się z nim zapoznać to proszę: Funkcje

    OdpowiedzUsuń
  3. No zgoda, tylko że ja tak nie potrafię korzystać nie zastanawiając się co znaczy. Jeśli czegoś używam muszę wiedzieć co oznacza? Po co się to tak stosuje itp. Dla mnie korzystanie z czegoś gdy nie wiem co znaczy to tak jakbym próbował mówić w innym języku nie znając znaczenia poszczególnych słów.

    OdpowiedzUsuń
  4. Gdy korzysta się pierwszego w życiu roweru, nie zastanawia się jak dokładnie jak jest zbudowany i jak działa hamulec. Po prostu się go używa.

    I tak właśnie trzeba postąpić w tym przypadku, a w dalszej części kursu dowiesz się wszystkiego i zrozumiesz działanie.

    To tym ważniejsze, że w języku C (jak w wielu innych) wiele rzeczy się zazębia i trzeba od czegoś zacząć.

    OdpowiedzUsuń
  5. To chociaż powiedz czemu zaczynając pisze się int main(void). Głównie chodzi mi o to co w nawiasie. Dlaczego tam nie może być czegoś innego? Na przykład wstawił bym wyraz (why)

    OdpowiedzUsuń
    Odpowiedzi
    1. Toż to Ci już odpowiedzieli ze int (skrot od integer) to typ zwracanej wartości funkcji i zwraca się ją instrukcją return 0 (przyjęło się że zero oznacza poprawne zakończenie funkcji a wszystkie inne wartości błąd) natomiast to co jest w nawiasie to są parametry funkcji czyli składowe użyte wewnątrz void (z angielskiego pustka) oznacza że funkcja nie przyjmuje żadnych parametrów możesz void pominąć i też nie wybuchnie. Co do #include to instrukcja ta jest instrukcją preprocesora i ona dosłownie wstawia zawartość pliku jakiś_plik.h w to miejsce, po co to robi a po to ze w pliku są definicję funkcji ktorych możesz potrzebować w programie, a żeby się dowiedzieć jakie to funkcje to możesz zajrzeć do pliku lub szukać w necie :)

      Usuń
  6. W poprzednim moim komentarzu podałem Ci link do artykułu Funkcje, w którym jest to wyjaśnione pomimo, że artykuł jest w trakcie tworzenia.

    OdpowiedzUsuń
  7. Rozwiń skróty %s, %d, %f. Ja się uczę kojarząc całe nazwy a nie ich skróty. Inaczej dla mnie to nic nie znaczące literki ze znakami %.

    OdpowiedzUsuń
  8. Jest opisane w tym artykule w punkcie Wyświetlanie liczb. Czytaj od tego punktu, aż do końca artykułu.

    Jeżeli ten opis Ci nie wystarczy, to zaglądnij do opisu funkcji printf() w spisie treści kursu.

    OdpowiedzUsuń
  9. Odnośnie przykładu nr 9. Dlaczego kompilator sam nie wybierze sobie odpowiedniej zmiennej i muszą one być ustawione w odpowiedniej kolejności?

    Na przykład zmiana kodu na:
    printf("%s ma %d braci o łącznej wadze %f kg.", 3,"Michał", 201.45);

    Czyli zamiana miejscami zmiennej tekstowej ze zmienną liczbową spowoduje błąd kompilatora.

    OdpowiedzUsuń
  10. Na przykład masz 3 zmienne i wszystkie są tego samego typu czyli np. ciągami znaków do których stosujemy format %s. Jak kompilator ma zdecydować który gdzie podstawić?

    Dlatego właśnie kompilator analizuje od lewej i po kolei podstawia dane wybierając je także od lewej.

    ------

    Tak, zmiana miejscami spowoduje błąd, ponieważ typ danej nie będzie odpowiadał typowi formatu. Czyli np. "Michał" trafi na format %d.

    Możesz to sprawdzić w CManiak'u.

    OdpowiedzUsuń
  11. Błąd w czasie przesyłu danych do kompilacji. Spróbuj ponownie.

    CO jest nie tak ?

    OdpowiedzUsuń
  12. Nie wiem, muszę sprawdzić. Ale dzisiaj nie dam niestety rady.

    OdpowiedzUsuń
  13. W końcu znalazłem zajęcie na nudne chwile w pracy:) Wielki plus za wbudowany kompilator!

    OdpowiedzUsuń
  14. Bardzo dobrze opisane, a przykłady z pierwszej części wręcz zachęcają by je modyfikować.
    Niby nic, a jak cieszy, że coś wychodzi!
    Dzięki!

    OdpowiedzUsuń
  15. Muszę przyznać kawał dobrej roboty, pierwsze skojarzenia po przebrnięciu kilku artykułów tego kursu, to ma się wrażenie jakbym czytał interaktywną książke :D Super sprawa, nie muszę nic instalować, modyfikować, wszystko dobrze wytłumaczone, mogę poesperymentować z przykładami no po porstu b

    OdpowiedzUsuń
  16. Bardzo mnie cieszy że znalazłem ten kurs, interaktywny przewodnik można eksperymentować i uczyć się nawet w pracy, szkole dzięki temu CManiakowi. Super sprawa, autor odwalił kawał dobrej roboty. Tylko teraz nie dokońca wiem, do czego teraz mam przejść ;/

    OdpowiedzUsuń
    Odpowiedzi
    1. Cieszę się, że się podoba i przydaje :-)

      Nie rozumiem jednak o co pytasz ... Spis treści kursu znajdziesz klikając duży link Kurs języka C na początku tego artykułu. Na wszelki wypadek tutaj link podaję: Kurs języka C.

      No chyba że pytasz od którego tematu w spisie treści zacząć :-) to zawsze jest problemem - leć po kolei i nie zrażaj się, że czegoś nie rozumiesz - w końcu wszystko połączy się w jedną całość.

      Powodzenia!

      Usuń
  17. Rewelacja!!!!!!!!!!!!!!!
    tyle, że są minusy (właściwie jeden):
    Kurs jest tak popularny, że nie da się korzystać z CManiaka, bo serwer jest przeciążony
    Pewnie ze względu na koszty nic się z tym nie da zrobić?

    OdpowiedzUsuń
  18. Sprawdziłem - działa szybko i sprawnie. Sprawdź proszę jeszcze raz z tym że wyczyść cały cache przeglądarki. Jeżeli nie pomoże, to spróbuj na innej przeglądarce.

    OdpowiedzUsuń
  19. Jak wyświetlić ciąg "\n"

    OdpowiedzUsuń
  20. :) tylko kompilator ma nonstop zajęty serwer

    OdpowiedzUsuń
    Odpowiedzi
    1. Sprawdziłem - kompilator działa prawidłowo. Opisz może dokładnie z jakiej przeglądarki i na jakim systemie korzystasz.

      Usuń
  21. Dondu : świat jest lepszy dzięki takim ludziom jak Ty :)

    OdpowiedzUsuń
  22. Rewelka, wszystkie opisy języka C jakie do tej pory znalazłem w sieci, opisują do momentu kodu źródłowego a dalej ??? sam się męcz
    Tutaj przynajmniej autor pomyślał i wytłumaczył jak działa kompilator. Jeżeli coś by się jeszcze przydało:
    1) jak z języka C konkretnie w ten sam sposób uczynić kod assemblerem ?
    2) jak skorzystać z łączenia linkerem ?
    Świetny kurs . Pozdrawiam.

    OdpowiedzUsuń
  23. Czy CManiak powinien działać?

    OdpowiedzUsuń
    Odpowiedzi
    1. Niestety na razie nie. Ponowne włączenia planowane jest w trakcie wakacji tego roku.

      Usuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.