Programowanie w elektronice: Podstawy C

Podobne dokumenty
Podstawy programowania w języku C

1 Podstawy c++ w pigułce.

Podstawy programowania skrót z wykładów:

Wstęp do Programowania, laboratorium 02

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

1 Podstawy c++ w pigułce.

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Podstawy Programowania Podstawowa składnia języka C++

Programowanie strukturalne i obiektowe

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Instrukcje sterujące. Programowanie Proceduralne 1

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Lab 9 Podstawy Programowania

2 Przygotował: mgr inż. Maciej Lasota

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Podstawy Programowania C++

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Zmienne, stałe i operatory

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Część 4 życie programu

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Języki i metodyka programowania. Wprowadzenie do języka C

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy programowania C. dr. Krystyna Łapin

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Microsoft IT Academy kurs programowania

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Mikrokontroler ATmega32. Język symboliczny

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Wstęp do wskaźników w języku ANSI C

Język C zajęcia nr 11. Funkcje

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania w języku C i C++

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Wskaźniki w C. Anna Gogolińska

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Podstawy i języki programowania

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

( wykł. dr Marek Piasecki )

KURS C/C++ WYKŁAD 6. Wskaźniki

Język ludzki kod maszynowy

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

I - Microsoft Visual Studio C++

Programowanie Obiektowe i C++

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Tablice, funkcje, wskaźniki - wprowadzenie

Wykład 2 Składnia języka C# (cz. 1)

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wskaźniki. Informatyka

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

MATERIAŁY DO ZAJĘĆ II

Wskaźniki. Programowanie Proceduralne 1

dr inż. Jarosław Forenc

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Podstawy Programowania.

Języki i metodyka programowania. Wskaźniki i tablice.

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Każdy z nich posiada swoje parametry. W przypadku silnika może to być moc lub pojemność, w przypadku skrzyni biegów można mówić o skrzyni

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

4. Funkcje. Przykłady

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Język C, tablice i funkcje (laboratorium, EE1-DI)

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Podstawy programowania w języku C++

Transkrypt:

Programowanie w elektronice: Podstawy C Projekt Matematyka dla Ciekawych Świata, Robert Ryszard Paciorek <rrp@opcode.eu.org> 2019-05-05 C / C++ są najpopularniejszymi językami kompilowanymi do kodu maszynowego (a jeżeli traktować je łącznie to najpopularniejszymi językami w ogóle), pozwalają na stosowanie niskopoziomowych mechanizmów (łącznie z wstawkami asemblerowymi), są użyteczne do bezpośredniego programowania sprzętu (bez warstwy systemu operacyjnego) czy też tworzenia systemów operacyjnych. Język C jest językiem kompilowalnym to znaczy (po zmodyfikowaniu źródeł) przed uruchomieniem programu konieczne jest dokonanie tłumaczenia kodu źródłowego na kod maszynowy przy pomocy odpowiedniego programu (np. clang lub gcc). Kompilacja przebiega kilku etapowo. W pierwszej kolejności wywoływany jest preprocesor, który jest odpowiedzialny za włączanie plików określonych poprzez #include (jest to literalne włączenie zawartości wskazanego pliku w danym miejscu, obsługę rozwijania stałych makr preprocesora (definiowanych z użyciem #define) oraz kompilację warunkową z wykorzystaniem poleceń takich jak #ifdef czy #if. Kompilatory pozwalają na uzyskanie nie tylko wynikowego pliku binarnego, ale także plików po przetworzeniu przez preprocesor czy też po konwersji na assembler. 1 Zmienne Język C wymaga określania typu zmiennej w momencie jej definiowania. // liczba całkowita ze znakiem int liczbaa = -34; // liczba rzeczywista (pojedynczej precyzji) float liczbab = 673.1; // 8 bitowa liczba całkowita bez znaku, wymaga pliku nagłówkowego inttypes.h uint8_t liczbac = 0xf3; // zmienna napisowa "C NULL-end string" char* napisa = "q we"; 2 Podstawowe operacje Dodawanie, mnożenie, odejmowanie zapisuje się i działają one tak jak w normalnej matematyce, dzielenie zapisuje się przy pomocy ukośnika i zależnie od typów na których operuje jest ono dzieleniem całkowitym lub zmiennoprzecinkowym. double a = 12.7, b = 3, c, d, e; int x = 5, y = 6, z; // dodawanie, mnożenie, odejmowanie zapisuje się // i działają one tak jak w normalnej matematyce: e = (a + b) * 4 - y; 1

// dzielenie zależy od typów argumentów d = a / b; // będzie dzieleniem zmiennoprzecinkowym bo a i b są typu float c = x / y; // będzie dzieleniem całkowitym bo z i y są zmiennymi typu int b = (int)a / (int)b; // będzie dzieleniem całkowitym a = (double)x / (double)y; // będzie dzieleniem zmiennoprzecinkowym // reszta z dzielenia (tylko dla argumentów całkowitych) z = x % y; // wypisanie wyników printf("%d %f %f %f %f %f\n", z, e, d, c, b, a); // operacje logiczne: // ((a większe równe od 0) AND (b mniejsze od 2)) OR (z równe 5) z = (a>=0 && b<2) z == 5; // negacja logiczna z x =!z; printf("%d %d\n", z, x); // operacje binarne: // bitowy OR 0x0f z 0x11 i przesunięcie wyniku o 1 w lewo x = (0x0f 0x11) << 1; // bitowy XOR 0x0f z 0x11 y = (0x0f ^ 0x11); // negacja bitowa wyniku bitowego AND 0xfff i 0x0f0 z = ~(0xfff & 0x0f0); printf("%x %x %x\n", x, y, z); 3 Przepływ sterowania w programie - skoki, warunki, pętle, funkcje Licznik programu (program counter, instruction pointer lub instruction address register) jest rejestrem procesora który określa adres następnej (w niektórych architekturach aktualnej) instrukcji która ma zostać przetworzona procesor. Skoki bezwarunkowe, instrukcje warunkowe, pętle, wywołania funkcji są realizowane poprzez modyfikację licznika programu. W przypadku wywołań funkcji dodatkowo wykonywane są operacje związane z obsługą stosu (zachowywaniem stanu rejestrów, umieszczaniem argumentów na stosie,...). Instrukcja goto (realizująca skok bezwarunkowy) jest pełnoprawną instrukcją skoku, jedyną wadą jej stosowania jest to że przy niewłaściwym / zbyt częstym wykorzystywaniu (zamiast wywołań funkcji, warunków i pętli) kod programu staje się mniej czytelny. W większości przypadków pętle realizowane są na poziomie kodu maszynowego jako zestaw instrukcji (np. inkrementacji zmiennej, sprawdzania warunku, skoku), jednak w niektórych rozwiązaniach pętle (np. typu powtórz n razy ) mogą być realizowane sprzętowo przy pomocy pojedynczej instrukcji. 3.1 Punkt startu Jako że program komputerowy jest sekwencją wykonywanych instrukcji musi rozpoczynać się od określonego miejsca. W przypadku kodu C/C++ punktem startu jest funkcja main(). Zakończenie tej funkcji 2

oznacza zakończenie programu, a wartość przez nią zwracana odpowiedzialna jest za tzw. kod powrotu przekazany procesowi wywołującemu program. // włączenie pliku nagłówkowego int i, j, k; // instrukcja waunkowa if - else if (i<j) { puts("i<j"); else if (j<k) { puts("i>=j AND j<k"); else { puts("i>=j AND j>=k"); // podstawowe operatory logiczne if (i<j j<k) puts("i<j OR j<k"); // innymi operatorami logicznymi są && (AND),! (NOT) // pętla for for (i=2; i<=9; ++i) { if (i==3) continue; // pominięcie tego kroku pętli if (i==7) break; // wyjście z pętli printf(" a: %d\n", i); // pętla while while (i>0) { printf(" b: %d\n", --i); // pętla do - while do { printf(" c: %d\n", ++i); while (i<2); // instrukcja wyboru switch switch(i) { case 1: puts("i==1"); break; default: puts("i!=1"); break; 3

3.2 Własne funkcje // funkcja bezargumentowa niezwracająca wartości void f1() { puts("abc"); // funkcja dwuargumentowa zwracająca wartość int f2(int a, int b) { puts("f2"); return a*2.5 + b; f1(); int a = f2(3, 6); // zwracaną wartość można wykorzystać (jak wyżej) lub zignorować printf("%d\n", a); 4 Złożone typy danych 4.1 Struktury Struktura jest złożonym typem danych służącym do grupowania powiązanych ze sobą logicznie zmiennych. Zmienne wchodzące w skład struktury (pola) identyfikowane są nazwami i mogą być różnych typów. Struktura zajmuje ciągły obszar pamięci, w którym umieszczane są wartości kolejnych pól. struct Struktura { int a, b; double c; ; struct Struktura s; s.a = 13; s.c = 17.3; printf("%f\n", s.a + s.c); 4.2 Tablice Tablica jest strukturą danych w której elementy (takiego samego typu) są ułożone w porządku liniowym i są dostępne za pomocą indeksów (kluczy). Typowo tablica indeksowana jest liczbami całkowitymi nie ujemnymi oraz zajmuje ciągły obszar pamięci. 4

int t[4] = {1, 8, 3, 2; printf("%d -> \n", t[2]); t[2] = 55; printf(" %d \n", t[2]); 4.3 Napisy Napisy w C są w istocie tablicami elementów typu char. Pojedynczy znak reprezentowany jest poprzez jeden element tablicy (dla znaków kodowanych jednobajtowo) lub grupę takich elementów (dla znaków kodowanych wielobajtowo, np. polskich znaczków w UTF8). Koniec napisu oznaczany jest przez element o wartości zero (NULL). 5 Zmienna i jej adres Wszelkie dane na których operuje program komputerowy przechowywane są w jakimś rodzaju pamięci - najczęściej jest to pamięć operacyjna. W pewnych sytuacjach niektóre dane mogą być przechowywane np. tylko w rejestrach procesora lub rejestrach urządzeń wejścia-wyjścia. W programowaniu na poziomie wyższym od kodu maszynowego i asemblera używa się pojęcia zmiennej i (niemal zawsze) pozostawia kompilatorowi/interpretatorowi decyzję o tym gdzie ona jest przechowywana. Oczywistym wyjątkiem są grupy zmiennych, czy też bufory alokowane w sposób jawny w pamięci. Ze względu na ograniczoną liczbę rejestrów procesora większość zmiennych (w szczególności tych dłużej istniejących i większych) będzie znajdowała się w pamięci i będą przenoszone do rejestrów celem wykonania jakiś operacji na nich po czym wynik będzie przenoszony do pamięci. Z każdą zmienną przechowywaną w pamięci związany jest adres pamięci pod którym się ona znajduje. Niektóre z języków programowania pozwalają na odwoływanie się do niego poprzez wskaźnik na zmienną lub referencję do zmiennej (odwołania do adresu zmiennej mogą wymusić umieszczenie jej w pamięci nawet gdyby normalnie znajdowała się tylko w rejestrze procesora). Wszystkie dane są zapisywane w postaci liczb lub ciągów liczb. Typ zmiennej (jawny lub nie) informuje o tym jakiej długości jest dana liczba i jak należy ją interpretować (jak należy interpretować ciąg liczb). 5.1 Wskaźniki Wskaźnik jest zmienną, która przechowuje adres pamięci, pod którym znajdują się jakieś dane (inna zmienna). Jako że wskaźnik jest zmienną która też jest umieszczona gdzieś w pamięci można utworzyć wskaźnik do wskaźnika itd. Na wskaźnikach można wykonywać operacje arytmetyczne (najczęściej jest to dodawanie offsetu). Na wskaźniku można wykonać operację wyłuskania czyli odwołania się do wartości zmiennej pod adresem na który wskazuje, a nie do zmiennej wskaźnikowej (zawierającej adres). Wskaźniki pozwalają na operowanie dużymi zbiorami danych (duże struktury, napisy, etc) bez konieczności ich kopiowania przy przekazywaniu do funkcji, umieszczaniu w różnych strukturach danych, sortowaniu, itd (kopiowaniu ulega jedynie wskaźnik czyli adres) oraz na współdzielenie tych samych danych pomiędzy różnymi obiektami. Wskaźnik może wskazywać na niewłaściwy adres w pamięci (np. na skutek zwolnienia tego fragmentu lub błędu w operacjach matematycznych na wskaźnikach - wyjściu poza dozwolony zakres), typowo wskaźnikowi który nic nie wskazuje przypisuje się wartość NULL (zero). Wyłuskania wskaźników o wartości NULL lub wskazujących niewłaściwy obszar pamięci prowadzą do błędów programu, często do zakończenia programu z powodu naruszenia ochrony pamięci ( Segmentation fault ). 5

int zm = 13; int *wsk = NULL; // zmienna wskaźnikowa (na typ int) // przypisanie do zmiennej wskaźnikowej adresu zmiennej zm // pobranie adresu zmiennej przy pomocy operatora & wsk = &zm; printf("%p %p\n", &zm, wsk); // odwołanie do zmiennej wskazywanej przez wskaźnik (wyłuskanie wartości) // przy pomocy operatora * printf("%d %d\n", zm, *wsk); *wsk = 17; printf("%d %d\n", zm, *wsk); 5.2 Wskaźniki a tablice Zmienna tablicowa w C to w istocie wskaźnik na pierwszy element tablicy. Dostęp do elementów tablicy odbywa się w oparciu o obliczanie ich adresu na podstawie zależności: AdresElementu = AdresPoczatku- Tablicy + IndexElementu * RozmiarElementu. int t[4] = {1, 8, 3, 2; int *tt = t; // zauważ brak operatora pobrania adresu printf("%d %d\n", t[2], tt[2]); printf("%d %d\n", *(t + 2), *(tt + 2)); Zauważ że operator t[x] działa tak samo dla tablicy jak i dla wskaźnika i jest w istocie ładniejszym zapisem operacji *(t+x) na samym wskaźniku. 5.3 Arytmetyka wskaźnikowa Jak już zauważyliśmy na wskaźnikach można wykonywać (niektóre) operacje arytmetyczne. Ich działanie jest zależne od typu wskaźnika, tj. zwiększenie wskaźnika o 1 zwiększa adres na który on wskazuje o tyle bajtów ile zajmuje zmienna której typu jest wskaźnik. char a; int b; char *wsk_a = &a; int *wsk_b = &b; printf("char: %p %p\n", wsk_a, wsk_a+1); 6

printf("int: %p %p\n", wsk_b, wsk_b+1); Matematyka dla Ciekawych Świata, 2017-2018. Robert Ryszard Paciorek <rrp@opcode.eu.org>, 2003-2019. Kopiowanie, modyfikowanie i redystrybucja dozwolone pod warunkiem zachowania informacji o autorach. 7