Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 8 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B
Plan prezentacji Biblioteka GSL Na podstawie: https://www.gnu.org/software/gsl/doc/html/index.html
Biblioteka GSL Biblioteka GSL GNU Scientific Library to zbiór implementacji numerycznych metod obliczeniowych. Biblioteka została napisana w języku C, ale możliwe jest jej wywoływanie z języków wysokiego poziomu. Kod jest rozpowszechniany w oparciu o licencję GNU General Public License.
Biblioteka GSL Biblioteka GSL GNU Scientific Library udostępnia wiele struktur i funkcji pozwalających na wykonywanie obliczeń związanych między innymi z: liczbami zespolonymi, wielomianami, sortowaniem, algebrą liniową, liczbami losowymi, różniczkowaniem i całkowaniem numerycznym.
Biblioteka GSL Kod źródłowy biblioteki GSL jest ogólnodostępny (http://www.gnu.org/software/gsl/ ). Pliki skompilowane (dla systemu Windows) są dostępne na stronie: http://www.neff.co.at/2017/05/01/gsl-and- FGSL-for-CodeBlocks-16.01.html
Biblioteka GSL Konfiguracja Code::Blocks i GSL pobrany plik gsl-2.3.zip należy rozpakować na dysku, w środowisku Code::Blocks należy edytować ustawienia kompilatora (menu Settings -> Compiler ), w zakładce Linker settings należy dodać skompilowane pliki biblioteki (pliki *.a w katalogu lib), w zakładce Search directories należy dodać ścieżkę dostępu do katalogu include (zawierającego pliki nagłówkowe).
Biblioteka GSL
Biblioteka GSL
Biblioteka GSL
Biblioteka GSL
Biblioteka GSL
Biblioteka GSL
Biblioteka GSL
Biblioteka GSL Pliki nagłówkowe napisano w taki sposób, aby możliwe było wywoływanie biblioteki GSL bezpośrednio z programów języka C++
Biblioteka GSL Przykładowy program
Biblioteka GSL Wyznaczenie pierwiastków wielomianu
Biblioteka GSL Wyznaczenie pierwiastków wielomianu
Biblioteka GSL Rozwiązywanie układu równań Ax = b
Biblioteka GSL Rozwiązywanie układu równań Ax = b
Biblioteka GSL Rozwiązywanie układu równań Ax = b
Biblioteka GSL Rozwiązywanie układu równań Ax = b
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych ogólna postać układu równań różniczkowych dy i dt t 1 f t, y t, y t dla i 1, n i n macierz Jacobiego J ij f t, y t i y j
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych Przykład równanie nieliniowego oscylatora Van der Pola 2 u '' t u ' t u t 1 u t 0 po podstawieniu v u ' t otrzymujemy układ równań u' v v ' u v 1 u 2
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych Program rozwiązuje zagadnienie początkowe: układ równań różniczkowych dla μ = 10 z warunkiem początkowym (u, v) = (1, 0) na zakresie zmiennej niezależnej t od 0 do 100. Program wyświetla rozwiązania wartości funkcji u oraz v dla t i = 1, 2, 100.
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych
Biblioteka GSL Rozwiązywanie równań różniczkowych zwyczajnych 2,50 2,00 1,50 1,00 0,50 0,00-0,50 0 20 40 60 80 100-1,00-1,50-2,00-2,50
Przykładowy projekt program oblicza odsetki od podanej kwoty przy zadanym oprocentowaniu rocznym przez ustaloną liczbę lat
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone)
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone) Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone) Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone) Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona Cel kompilacji Build >> Select target >> Debug
Konfiguracja Symbole debuggowania Project >> Build options >> Produce debugging symbols [-g] (zaznaczone) Opcja Strip all symbols from binary [-s] nie powinna być zaznaczona Cel kompilacji Build >> Select target >> Debug
Wstrzymywanie działania Definiowanie punktu wstrzymania Debug >> Toggle breakpoint lub F5
Wstrzymywanie działania Definiowanie punktu wstrzymania Debug >> Toggle breakpoint lub F5
Wstrzymywanie działania Definiowanie punktu wstrzymania Debug >> Toggle breakpoint lub F5
Wstrzymywanie działania Definiowanie punktu wstrzymania Debug >> Toggle breakpoint lub F5 Uruchomienie programu Debug >> Start lub F8
Wstrzymywanie działania Definiowanie punktu wstrzymania Debug >> Toggle breakpoint lub F5 Uruchomienie programu Debug >> Start lub F8
Wstrzymywanie działania Definiowanie punktu wstrzymania Debug >> Toggle breakpoint lub F5 Uruchomienie programu Debug >> Start lub F8
Okna debuggera Okna debuggera zawierają różne informacje o wykonywanym programie Debug >> Debugging windows
Okna debuggera Okna debuggera zawierają różne informacje o wykonywanym programie Debug >> Debugging windows
Okna debuggera Okna debuggera zawierają różne informacje o wykonywanym programie Debug >> Debugging windows Okno Watches pokazuje wartości zmiennych lokalnych i argumentów funkcji
Okna debuggera Okna debuggera zawierają różne informacje o wykonywanym programie Debug >> Debugging windows Okno Watches pokazuje wartości zmiennych lokalnych i argumentów funkcji
Śledzenie działania programu W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7)
Śledzenie działania programu W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7)
Śledzenie działania programu W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7) Po osiągnięciu linii 12 program oczekuje na podanie danych (funkcja scanf()) Podobnie w liniach 14 i 16 Wartości zmiennych możemy sprawdzić w oknie Watches
Śledzenie działania programu W celu wykonania następnych wierszy programu wykonamy polecenie Next line (F7) Po osiągnięciu linii 12 program oczekuje na podanie danych (funkcja scanf()) Podobnie w liniach 14 i 16 Wartości zmiennych możemy sprawdzić w oknie Watches
Śledzenie działania programu Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza
Śledzenie działania programu Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza
Śledzenie działania programu Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza
Śledzenie działania programu Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza Sterowanie w programie przejdzie do linii 25 (pierwsza instrukcja w wywołanej funkcji) Zmienne i oraz koncowy_mnoznik są niezainicjalizowane
Śledzenie działania programu Po osiągnięciu linii 17 wywołamy polecenie Step into, które służy do wejścia do funkcji, która ma zostać wywołana z bieżącego wiersza Sterowanie w programie przejdzie do linii 25 (pierwsza instrukcja w wywołanej funkcji) Zmienne i oraz koncowy_mnoznik są niezainicjalizowane
Śledzenie działania programu Po przejściu do kolejnego wiersza (F7) widzimy, że zmienna i została zainicjalizowana, natomiast wartość zmiennej koncowy_mnoznik pozostała bez zmian
Śledzenie działania programu Po przejściu do kolejnego wiersza (F7) widzimy, że zmienna i została zainicjalizowana, natomiast wartość zmiennej koncowy_mnoznik pozostała bez zmian Znaleźliśmy błąd niezainicjalizowaną zmienną wykorzystując debugger
Śledzenie działania programu Po przejściu do kolejnego wiersza (F7) widzimy, że zmienna i została zainicjalizowana, natomiast wartość zmiennej koncowy_mnoznik pozostała bez zmian Znaleźliśmy błąd niezainicjalizowaną zmienną wykorzystując debugger
Debugowanie awarii
Debugowanie awarii
Debugowanie awarii Ten program nie działa kończy działanie w nieprawidłowy sposób Błędu można poszukiwać wykorzystując debugger Debugger zgłosi błąd segmentacji
Debugowanie awarii Debugger zatrzymał się w miejscu, w którym nastąpiła błędna instrukcja (linia 26)
Debugowanie awarii Debugger zatrzymał się w miejscu, w którym nastąpiła błędna instrukcja (linia 26) Wskaźnik n ma wartość 0xbaadf00d (bad food) jest to specjalna wartość używana podczas uruchamiania programów pod kontrolą debuggera do inicjalizowania pamięci
Debugowanie awarii Debugger zatrzymał się w miejscu, w którym nastąpiła błędna instrukcja (linia 26) Wskaźnik n ma wartość 0xbaadf00d (bad food) jest to specjalna wartość używana podczas uruchamiania programów pod kontrolą debuggera do inicjalizowania pamięci
Debugowanie awarii Prześledźmy stos wywołań (Call stack) Na dole widoczne jest wywołanie funkcji main(), które rozpoczęło program Następnie wywołano funkcję printlist() trzy razy, przy czym w ostatnim wywołaniu pojawiła się wartość 0xbaadf00d Znaleźliśmy błąd niezainicjalizowany wskaźnik
Debugowanie awarii
Debugowanie awarii Informacje z innych ramek stosu możemy uzyskać przełączając widok (Swich to this frame)
Debugowanie awarii Informacje z innych ramek stosu możemy uzyskać przełączając widok (Swich to this frame)
Zaglądanie do zawieszonego programu Jeśli program zatrzymał się z nieznanego powodu można wykorzystać debugger, aby włamać się do programu
Zaglądanie do zawieszonego programu
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger Po zatrzymaniu programu sprawdzamy stos wywołań
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger Po zatrzymaniu programu sprawdzamy stos wywołań
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger Po zatrzymaniu programu sprawdzamy stos wywołań Aby przejść do naszego programu musimy zmienić wątek
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger Po zatrzymaniu programu sprawdzamy stos wywołań Aby przejść do naszego programu musimy zmienić wątek
Zaglądanie do zawieszonego programu Po uruchamieniu programu w trybie debugowania mamy możliwość włamania się do niego Menu Debug >> Break debugger Po zatrzymaniu programu sprawdzamy stos wywołań Aby przejść do naszego programu musimy zmienić wątek
Zaglądanie do zawieszonego programu Przechodząc przez kolejne wiersze, obserwujemy, że program krąży między liniami 20 oraz 21 Zmienna i przyjmuje tylko dwie wartości 2 oraz 3
Zaglądanie do zawieszonego programu Przechodząc przez kolejne wiersze, obserwujemy, że program krąży między liniami 20 oraz 21 Zmienna i przyjmuje tylko dwie wartości 2 oraz 3
Zaglądanie do zawieszonego programu Przechodząc przez kolejne wiersze, obserwujemy, że program krąży między liniami 20 oraz 21 Zmienna i przyjmuje tylko dwie wartości 2 oraz 3 Możemy zauważyć, że pętla w działaniu programu wynikała z użycia operatora przypisania w miejsce operatora porównania
Zaglądanie do zawieszonego programu
Podsumowanie Biblioteka GSL