Podstawy Programowania

Podobne dokumenty
Podstawy Programowania

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

Podstawy Programowania. Zmienne dynamiczne, struktury, moduły programowe

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Lab 9 Podstawy Programowania

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

Podstawy programowania komputerów

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

Stałe, tablice dynamiczne i wielowymiarowe

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

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

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

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Wskaźniki w C. Anna Gogolińska

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

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

Podstawy programowania w języku C++

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Wskaźniki. Informatyka

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

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

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

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

Programowanie w języku C++

Język C, tablice i funkcje (laboratorium)

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

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

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

Tablice, funkcje - wprowadzenie

Pola i metody statyczne

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

Podstawy Programowania. Specyfikacja funkcji, operacje wejścia i wyjścia na plikach, rekurencja, tablice i wskaźniki

Wskaźniki. Programowanie Proceduralne 1

6 Przygotował: mgr inż. Maciej Lasota

Podstawy Programowania. Specyfikacja funkcji, operacje wejścia i wyjścia na plikach, rekurencja, tablice i wskaźniki

PARADYGMATY PROGRAMOWANIA Wykład 4

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

Podstawy Programowania

Tablice deklaracja, reprezentacja wewnętrzna

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

Język ANSI C tablice wielowymiarowe

Tablice, funkcje, wskaźniki - wprowadzenie

Podstawy programowania

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

Podstawy informatyki. Wykład nr 1 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Laboratorium nr 5: Mnożenie wektorów i macierzy

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Pliki. Informacje ogólne. Obsługa plików w języku C

Język C zajęcia nr 11. Funkcje

Referencje do zmiennych i obiektów

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

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Podstawy programowania w języku C++

Wykład 1: Wskaźniki i zmienne dynamiczne

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Wykład 8: klasy cz. 4

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wstęp do programowania

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

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Zmienne, stałe i operatory

Podstawy programowania w języku C++

Struktury czyli rekordy w C/C++

Wprowadzenie do programowania w języku C

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

Języki programowania obiektowego Nieobiektowe elementy języka C++

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

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

TEMAT : KLASY DZIEDZICZENIE

Zmienne i struktury dynamiczne

1 Podstawy c++ w pigułce.

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Wykład 4: Klasy i Metody

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

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Transkrypt:

Podstawy Programowania Wykład VII Zmienne dynamiczne, struktury, moduły programowe Robert Muszyński ZPCiR IIAiR PWr Zagadnienia: zmienne dynamiczne, tablice dynamiczne, struktury, wskaźniki do struktur, struktury zawierające tablice, tablice zawierające struktury, rozdzielna kompilacja moduły. Zmienne dynamiczne, struktury, moduły programowe 1 Zmienne dynamiczne Dostępna dla programu pamięć komputera, dzieli się na cztery obszary: kod programu, dane statyczne (np. stałe i zmienne globalne programu), dane automatyczne zmienne tworzone i usuwane automatycznie w trakcie działania programu na tzw. stosie (np. zmienne lokalne funkcji), dane dynamiczne organizowane przez menadżera pamięci dynamicznej na tzw. stercie, tworzone i usuwane na żądanie w dowolnym momencie pracy programu. Copyright c 2007 2014 Robert Muszyński Niniejszy dokument zawiera materiały do wykładu na temat podstaw programowania w językach wysokiego poziomu. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych, prywatnych potrzeb i może być kopiowany wyłącznie w całości, razem ze stroną tytułową. Skład FoilTEX Zmienne dynamiczne, struktury, moduły programowe 2 Zmienne dynamiczne: Zmienne dynamiczne cd. są anonimowe, tzn. nie mają nazwy dostęp do takich zmiennych możliwy jest jedynie poprzez ich adres w pamięci (poprzez zmienne wskaźnikowe), muszą być tworzone jawnie przez programistę (rezerwacja pamięci), mają nieograniczony zakres, tzn. można odowływać sie do nich z dowlonego miejsca programu, istnieją dowolnie długo tzn. do chwili ich usunięcie przez programistę (zwalnianie pamięci), tak samo jak dla zmiennych statycznych obowiązuje w ich przypadku ścisłe przestrzeganie zgodności typów, korzystanie z nieprzydzielonego we właściwy sposób obszaru pamięci najprawdopodobniej spowoduje błąd, próba zwolnienia nieprzydzielonego obszaru pamięci powoduje nieprzewidziane działanie. Zmienne dynamiczne, struktury, moduły programowe 3 Dynamiczne przydzielanie pamięci W języku C do dynamicznego przydzielania i zwalniania pamięci służą funkcje z nagłówka stdlib.h: void *malloc(size_t n) zwraca wskaźnik do n bajtów niezainicjowanej pamięci albo NULL, void *calloc(size_t n, size_t rozmiar) zwraca wskaźnik do obszaru mogącego pomieścić n elementów podanego rozmiaru rozmiar zainicjowanego zerami albo NULL, void free(void *wskaznik) zwalnia pamięć wskazywaną przez wskaznik, przy czym wartość wskaźnika wskaznik musi być wynikiem wcześniejszego wywołania funkcji malloc lub calloc. int *wsk; wsk = (int*) malloc(sizeof(int)); /* przydzielenie pamieci */ if(wsk == NULL) /* sprawdzamy czy sie udalo */ printf ("blad przydzialu pamieci\n"); exit(-1); *wsk = 17; *wsk *=3; /* dzialania na zmiennej dynamicznej */ free(wsk); /* zwalniamy pamiec przed zakonczeniem */

Zmienne dynamiczne, struktury, moduły programowe 4 Dynamiczne przydzielanie pamięci cd. Prościutkie przykłady: int *i1, *i2; i1 = (int*) malloc(sizeof(int)); *i1 = 5; i2 = (int*) malloc(sizeof(int)); *i2 = 5; if (i1 == i2) printf("wskazniki takie same.\n"); else printf("wskazniki rozne.\n"); i2 = i1; /*!!! ZGUBIONA ZMIENNA, NIEUZYTEK!!! */ if (i1 == i2) printf("wskazniki takie same.\n"); else printf("wskazniki rozne.\n"); *i2 = 7 if (*i1 == *i2) printf("wartosci takie same.\n"); else printf("wartosci rozne.\n"); Zmienne dynamiczne, struktury, moduły programowe 5 Zmienne dynamiczne tablica jednowymiarowa Przykład operowania na dynamicznej tablicy jednowymiarowej: void main(void) int rozmiar_tablicy, i; double *tablica_liczb; printf("ile liczb chcesz wprowadzic: "); scanf("%d", &rozmiar_tablicy); if( tablica_liczb = (double*) calloc(rozmiar_tablicy, sizeof(double))) for(i = 0; i < rozmiar_tablicy; i++) tablica_liczb[i] = 100; /*alt. *(tablica_liczb + i) = 100;*/... free(tablica_liczb); Zmienne dynamiczne, struktury, moduły programowe 6 Zmienne dynamiczne, struktury, moduły programowe 7 Tablica statyczna versus dynamiczna Utworzenie statycznej tablicy jednowymiarowej: #define ROZMIAR_TABLICY 100 double tablica_statyczna[rozmiar_tablicy]; Utworzenie dynamicznej tablicy jednowymiarowej: int rozmiar_tablicy=7; double *tablica_dynamiczna; tablica_dynamiczna = (double*) calloc(rozmiar_tablicy, sizeof(double)); Odwoływanie się do tablic: int i = 3; tablica_statyczna[i] = 4; tablica_dynamiczna[i] = 4; Dynamiczna tablica dwuwymiarowa Nie ma prostego sposobu zdefiniowania dynamicznej tablicy dwuwymiarowej. int main() int wym_x, wym_y; /* wymiary tablicy */ wym_x = 5; wym_y = 7; /* symulujemy pobranie wymiarow */ /* definiujemy zmienna wskaznikowa odpowiedniej postaci */ int (*tablica)[wym_x]; /* i powolujemy nasza tablice do zycia */ tablica = (int(*)[wym_x]) malloc(wym_x*wym_y*sizeof(int)); /* teraz mozemy robic z nia co chcemy :) */ for(int i = 0; i < wym_y; i++) for(int j = 0; j < wym_x; j++) tablica[i][j] = 10*i+j; return 0;

Zmienne dynamiczne, struktury, moduły programowe 8 Struktury Składnia specyfikatora struktury zapisana w notacji MBNF specyfikator_struktury = "struct" [ identyfikator ] "" lista_deklaracji_skladowych "" "struct" identyfikator. Przykłady: struct zm1; struct zm2, zm3; zm1.re = 10; zm1.im = 20; struct zsp zm1; struct zsp zm2,zm3; zm2.re = zm1.re + 10; zm2.im = zm1.im + 15; struct zsp ; struct zsp zm1; struct zsp zm2,zm3; zm3.re = zm1.re; zm3.im = zm2.re; Zmienne dynamiczne, struktury, moduły programowe 9 Operowanie strukturami Dozwolonymi opercjami dla struktury są: przypisanie innej struktury w całości skopiowanie jej w całości na inną strukturę pobranie jej adresu za pomocą operatora & odwołanie się do jej składowych przez kopiowanie i przypisanie rozumie się także przesyłanie argumentów funkcjom i zwracanie przez funkcje wartości. Zmienne dynamiczne, struktury, moduły programowe 10 Operowanie strukturami przykłady struct zsp zrob_zesp(int x, int y) struct zsp temp; temp.re = x; temp.im = y; return temp /* i gdzies dalej w programie */ l1 = zrob_zesp(0,0); l2 = zrob_zesp(a,b); struct zsp dodaj(struc zsp x, struct zsp y) x.re += y.re; x.im += y.im; return x; /* i gdzies dalej w programie */ l1 = dodaj(l1, l2); Zmienne dynamiczne, struktury, moduły programowe 11 Mieliśmy struct zsp ; struct zsp zm1; struct zsp zm2,zm3; Operowanie strukturami typedef A możemy napisać typedef struct zespolona; zespolona zm1; zespolona zm2,zm3; i teraz zespolona dodaj(zespolona x, zespolona y) x.re += y.re; x.im += y.im; return x;

Zmienne dynamiczne, struktury, moduły programowe 12 Operowanie strukturami wskaźniki Zdefiniujmy zespolona dodaj(zespolona *x, zespolona *y) (*x).re += (*y).re; (*x).im += (*y).im; return *x; /* i gdzies dalej w programie */ l3 = dodaj(&l1, &l2); Co raczej zapisujemy przy użyciu operatora -> zespolona dodaj(zespolona *x, zespolona *y) x->re += y->re; x->im += y->im; return *x; Zmienne dynamiczne, struktury, moduły programowe 13 Tablice a wskaźniki przypomnienie Pamiętamy, że tablice i wskaźniki mogą być inicjowane stałą wartością: char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; Uzyskujemy w ten sposób dwie tablice znakowe, lecz poprzez istotnie różne zmienne. tab jest tablicą, której zawartość jest zainicjalizowana określonymi znakami, której nie można zmienić jako zmiennej, ale której wszystkie pozycje znakowe mogą być dowolnie zmieniane. Natomiast ptr jest zmienną wskaźnikową zainicjalizowaną wskaźnikiem na napis znakowy. Wartość tej zmiennej wskaźnikowej można zmieniać dowolnie, lecz zawartości pozycji znakowych nie (napis jest tablicą stałą, przydzieloną w pamięci stałych). tab[1] = ptr[1]; /* poprawne kopiowanie znakow */ *(tab+1) = *(ptr+1); /* rowniez poprawne */ tab = ptr; /* to przypisanie jest NIEDOZWOLONE */ ptr[1] = tab[1]; /* kopiowanie znakow NIEDOZWOLONE */ *(ptr+1) = *(tab+1); /* rowniez NIEDOZWOLONE */ ptr = tab; /* poprawne, choc gubi pamiec */ Zmienne dynamiczne, struktury, moduły programowe 14 Struktury zawierające tablice Struktura dogodna dla obrazków i wczytywanie danych do niej ze strumienia typedef struct int wym_x, wym_y, odcieni; int piksele[1000][1000]; t_obraz; int czytaj(file *plik_we, t_obraz *obraz)... fscanf(plik_we,"%d", &(obraz->wym_x)); /* analog wym_y */ for(i = 0; i < obraz->wym_x; i++) for(j = 0; j < obraz->wym_y; j++) fscanf(plik_we, "%d", &(obraz->piksele[i][j])); t_obraz obrazek1; /* i gdzies w jakies funkcji */ czytaj(plik1, &obrazek1); t_obraz *obrazek1; /* albo dynamicznie */ obrazek1 = (t_obraz *) malloc(sizeof(t_obraz)); czytaj(plik1, obrazek1); Zmienne dynamiczne, struktury, moduły programowe 15 Struktury zawierające tablice cd. To samo co poprzednio, ale z dynamicznie alokowaną tablicą na piksele! typedef struct int wym_x, wym_y, odcieni; void *piksele; /* tu lezy pies pogrzebany, a czemu nie int */ t_obraz; int czytaj(file *plik_we, t_obraz *obraz)... fscanf(plik_we,"%d", &(obraz->wym_x)); /* analogicznie wym_y */ /* rezerwujemy odpowiednio duza tablice */ obraz->piksele = malloc(obraz->wym_x*obraz->wym_y*sizeof(int)); /* dopiero teraz definiujemy zmienna pomocnicza jako wskaznik na tablice */ /* o znanych wymiarach, tylko przez nia bedziemy sie odwolywac do pola */ int (*piksele)[obraz->wym_x]; /* piksele w strukturze z obrazem */ piksele=(int(*)[obraz->wym_x]) obraz->piksele; /*inicjujemy go jak trzeba*/ for(i = 0; i < obraz->wym_y; i++) /* i dzialamy!!! */ for(j = 0; j < obraz->wym_x; j++) fscanf(plik_we, "%d", &(piksele[i][j]));

Zmienne dynamiczne, struktury, moduły programowe 16 Moduły programowe dołączanie plików poleceniem preprocesora #include int Silnia(int N) printf("funkcja: Silnia, blad: ujemny argument: %d\n", N); else if (N == 0) return(1); else return(n * Silnia(N-1)); /* Silnia */ int main() int X; printf("podaj argument dla funkcji Silnia: "); scanf("%d",&x); printf("silnia(%1d) = %d\n", X, Silnia(X)); = = plik: silnia.c Zmienne dynamiczne, struktury, moduły programowe 17 int Silnia(int N) printf("funkcja: Silnia, blad: ujemny argument: %d\n", N); else if (N == 0) return(1); else return(n * Silnia(N-1)); /* Silnia */ #include "silnia.c" /* N I E S T O S O W A N E */ int main() int X; printf("podaj argument dla funkcji Silnia: "); scanf("%d",&x); printf("silnia(%1d) = %d\n", X, Silnia(X)); Kompilacja diablo 21:cc -Xc main.c = tworzy a.out plik: silnia.c Zmienne dynamiczne, struktury, moduły programowe 18 tworzenie modułów plik: modul.c /* identyczny jak silnia.c */ int Silnia(int N)... /* jak poprzednio */ /* Silnia */ int Silnia(int); /* prototyp funkcji importowanej */ int main() int X; printf("podaj argument dla funkcji Silnia: "); scanf("%d",&x); printf("silnia(%1d) = %d\n", X, Silnia(X)); Kompilacja (lub jak na stronie następnej) diablo 21:cc -Xc -c modul.c = tworzy modul.o diablo 22:cc -Xc -c main.c = tworzy main.o diablo 23:cc main.o modul.o = tworzy a.out Zmienne dynamiczne, struktury, moduły programowe 19 #include "modul.h" int Silnia(int N)... /* jak poprzednio */ plik: modul.c plik: modul.h int Silnia(int); /* prototyp funkcji eksportowanej */ #include "modul.h" int main()... /* jak poprzednio */ Kompilacja (lub jak na stronie poprzedniej) diablo 21:cc -Xc -c modul.c = tworzy modul.o diablo 22:cc -Xc main.c modul.o = tworzy a.out

Zmienne dynamiczne, struktury, moduły programowe 20 Podsumowanie Zagadnienia podstawowe 1. Jak zadeklarować dynamicznie zmienną typu całkowitego? 2. W jaki sposób przydziela się pamięć dla zmiennych wskaźnikowych? 3. Do czego służą funkcje: malloc, calloc? Czym się różnią? Czym różnią się następujące instrukcje, jeśli chodzi o rezultaty: int * p1 = (int *) malloc (100 * sizeof(int)) int * p1 = (int *) calloc (100, sizeof(int))? 4. Na czym polega i z czego wynika tworzenie nieużytków, jak temu zaradzić? 5. Czym różnią się dane statyczne od danych automatycznych? 6. Czym różnią się tablice statyczne od tablic dynamicznych? 7. Dlaczego nie jest możliwe skompilowanie programu zawierającego poniższe deklaracje globalne: int a = 10; int tab[a][a+1];? 8. Porównaj zalety tablic i struktur. 9. W celu skopiowania zawartości struktury zawierającej tablicę wystarczy użyć zwykłego przypisania? Jeśli tak, co zostanie skopiowane gdy tablica ta jest statyczna, a co gdy dynamiczna? 10. Podaj przykład deklaracji tablicy struktur oraz sposobu odwoływania się do elemwntów takiej tablicy. Zmienne dynamiczne, struktury, moduły programowe 21 11. Zaproponuj stukturę do przechowywania informacji o osobie (imię, nazwisko, rok urodzenia, adres (dodatkowa stuktura?) itp.) 12. Wymień zalety definiowania typów zmiennych (typedef). 13. Do czego służy pisanie programu w modułach? 14. Czy dzielenie programu na moduły ma na celu m.in. szybszą jego kompilację? 15. Co powinien zawierać plik źródłowy (*.c), a co nagłówkowy (*.h) w programie o budowie modułowej? Gdzie powinny się znaleźć warunki PRE i POST? 16. Jaka jest rola plików nagłówkowych? 17. Jak kompiluje się programy, w których skład wchodzą moduły? Zagadnienia rozszerzające 1. Wskaż różne sposoby zdefiniowania i wykorzystania dynamicznej tablicy dwuwymiarowej (w tym z wykorzystaniem makra pozwalającego na zdefiniowanie tablicy jednowymiarowej i odwoływanie się do niej jak do tablicy dwuwymiarowej). 2. W jaki sposób przy tworzeniu struktury typu t_obraz z dynamicznie alokowaną tablicą na piksele (pokazaną na slajdzie 15 można wykorzystać funkcję zdefiniowaną poniżej? int (*alloc_tablica(int wymiar))[] int (*tablica)[wymiar]; tablica = (int(*)[wymiar]) malloc(wymiar*wymiar*sizeof(int)); return tablica; Zmienne dynamiczne, struktury, moduły programowe 22 Zmienne dynamiczne, struktury, moduły programowe 23 W jaki sposób najlepiej zorganizować obsługę sytuacji, w ktorej tablica nie zostanie poprawnie zaalokowana (funkcja malloc zwróci wartość NULL)? 3. Czy standard ANSI C przewiduje możliwość przydzielenia konkretnego miejsca w pamięci? 4. Jakie są możliwe scenariusze w przypadku korzystania przez program z niezaalokowanej pamięci? Jakie rodzaje błędów mogą się pojawić? 5. Jaka jest różnica między strukturami (struct) a uniami (union)? 6. Czym są i jakie mają znaczenie kwalifikatory języka C typu const, volatile oraz restrict? 7. Wyjaśnij pojęcie struktur zagnieżdżonych. 8. Poczytaj o elastycznych składnikach tablicowych w odniesieniu do struktur. 9. Na czym polega automatyzacja procesu kompilacji za pomocą programu make? Napisz makefile dla swojego programu na przetwarzanie obrazów w wersji modułowej. Zadania 1. Przy użyciu funkcji malloc napisz własną funkcję równoważną w działaniu funkcji calloc. 2. Napisz funkcję, która pyta o imię, zapisuje je w utworzonej zmiennej dynamicznej i zwraca wskaźnik do niej. Przetestuj działanie funkcji, nie zapomnij o zwalnianiu pamięci przed zakończeniem głównego programu. 3. Napisz program wykonujący proste operacje na macierzach (dodawanie, mnożenie), przy czym macierze powinny być tworzone dynamicznie na podstawie wymiarów podanych przez użytkownika i przechowywane w odpowiednich strukturach. 4. Załóżmy, że dana jest statyczna tablica dwuwymiarowa 7x15 liczb całkowitych. Zapisz program, który przekopiuje dane z tej tablicy do tablicy dynamicznej, a następnie wyświetli zawartość nowej tablicy. Dopisz do programu funkcję, która znajdzie i wyświetli element maksymalny. 5. Wykorzystaj tablicę dwuwymiarową do napisania programu obsługującego szachownicę, w którym można byłoby zdefiniować układ figur na planszy a następnie sprawdzić możliwość wykonania zadanego ruchu (lub wyświetlić wszystkie dozwolone ruchy dla zadanej figury). 6. Napisz funkcję odejmującą dwie liczby zespolone. 7. Zaproponuj strukturę danych do przechowywania informacji o produktach (nazwa, ilość, cena). Napisz program, który pobierze dane o dwóch produktach i porówna je ze sobą. 8. Napisz program przechowujący w statycznej tablicy elementy struktury osoba (imię, nazwisko, wiek) oraz funkcje dodające i usuwające elementy takiej tablicy (zastanów się, co w przypadku tablicy statycznej znaczy dodać element, jak oznaczać elementy usuwane, a może można sobie poradzić z ich usuwaniem bez konieczności oznaczania). Przekształcić powyższy program tak, aby elementy tablicy były wskaźnikami. W funkcjach dodawania i usuwania elementów zastosuj funkcje rezerwujące i zwalniające pamięć. 9. Z programu zliczającego przecięcia zera wydziel funkcję sprawdzającą czy nastąpiło przecięcie zera, umieść ją w oddzielnym module i skompiluj całość.