DYNAMICZNE PRZYDZIELANIE PAMIECI



Podobne dokumenty
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).

Podstawy programowania w języku C++

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

Podstawy programowania komputerów

Programowanie w języku C++

Stałe, tablice dynamiczne i wielowymiarowe

Wskaźniki. Informatyka

Lab 9 Podstawy Programowania

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

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:

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

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Podstawy programowania w języku C++

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

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

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

Wskaźniki. Programowanie Proceduralne 1

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

Programowanie komputerowe. Zajęcia 4

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

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

Zadania z podstaw programowania obiektowego

Zmienne i struktury dynamiczne

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

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

Wykład 1: Wskaźniki i zmienne dynamiczne

Wskaźniki w C. Anna Gogolińska

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

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

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

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

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

tablica: dane_liczbowe

4) Operacje na tablicy dwuwymiarowej bez wykorzystywania indeksów liczbowych:

Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Jak Windows zarządza pamięcią?

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

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

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

Podstawy programowania w języku C++

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

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

Programowanie obiektowe W3

Programowanie i struktury danych

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Wstęp do programowania

dr inż. Paweł Myszkowski Wykład nr 8 ( )

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

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.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Tablice, funkcje - wprowadzenie

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Programowanie obiektowe

int tab_a [ 2 ] [ 3 ];

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

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

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

Techniki Programowania wskaźniki

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

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

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Podstawy programowania w języku C++

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

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

Wstęp do programowania, część II

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

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

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

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

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

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

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

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

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

Uzupełnienie dot. przekazywania argumentów

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe w C++ Wykład 1

Struktury czyli rekordy w C/C++

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

Język ludzki kod maszynowy

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

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

Techniki Programowania wskaźniki 2

Tablice, funkcje, wskaźniki - wprowadzenie

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

Wstęp do programowania

Wstęp do Programowania 2

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Podstawy programowania w języku C++

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

Szablony funkcji i szablony klas

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

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

Transkrypt:

DYNAMICZNE PRZYDZIELANIE PAMIECI Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne zmienne tworzone i usuwane automatycznie przez kompilator na tzw. stosie (ang. stack) np. zmienne lokalne wewnątrz funkcji void przykladowa_funkcja(void) float zmienna_lokalna; zmienna_lokalna=10; dane dynamiczne organizowane przez menadżera-zarządcę pamięci dynamicznej, można je tworzyć i usuwać w dowolnym momencie pracy programu, w pamięci wolnej komputera na tzw. stercie (ang. heap) Zmienne dynamiczne: odpowiedzialnym za ich utworzenie (rezerwację pamięci) oraz za ich usunięcie (zwolnienie pamięci) jest programista!!! dostęp do takiej zmiennej możliwy jest jedynie poprzez jej adres w pamięci (przechowywany w zmiennej wskaźnikowej) korzystanie z nieprzydzielonego obszaru najprawdopodobniej spowoduje błąd! próba zwolnienia już zwolnionego obszaru spowoduje błąd! Przykład ilustracja czasu życia zmiennych zmienna statyczna komputer na własność (cały czas) zmienna lokalna komputer w laboratorium (tylko na czas zajęć) zmienna dynamiczna komputer z wypożyczalni (na dowolny czas) Dostęp do obiektu za pomocą wskaźnika-adresu-odsyłacza WSKAŹNIK OBIEKT numer telefonu telefon adres internetowy strona HTML na serwerze adres pocztowy mieszkanie numer PESEL Kowalski Jan numer pokoju wynajęty apartament w hotelu numerek z szatni dynamicznie przydzielone miejsce-wieszak w szatni M. Piasecki, PODSTAWY PROGRAMOWANIA 1 Dynamiczne przydzielanie pamięci

W języku C do dynamicznego przydzielania pamięci (tworzenia zmiennych dynamicznych) służyły specjalne funkcje z bibliotek: <alloc.h> lub <stdlib.h> void malloc( size_t rozmiar ); // przydział bloku o zadanej wielkosci void calloc( size_t il_elementow, size_t rozmiar); // przydział tablicy void realloc( void* stary_wskaznik, size_t nowy_rozmiar); // zmiana wielkości void free( void wskaznik); // zwolnienie wskazywanego obszaru np. int main( void ) int wsk = NULL; // zmienna wskaźnikowa do zapamiętania adresu liczby int wsk = (int ) malloc( sizeof(int) ); // przydzielenie pamięci na liczbę int if( wsk == NULL ) printf( Błąd przydziału pamięci ); return; wsk = 10; wsk = 2; printf( %d, wsk ); scanf( %d, wsk ); free( wsk ); // przykładowe operacje na dynamicznej liczbie int // zwolnienie pamięci przed zakończeniem programu Przykład operacji na dynamicznej tablicy o dowolnej ilości elementów: np. void main( void ) int rozmiar_tablicy; double tablica_liczb; printf( Ile liczb chcesz wprowadzić: ); scanf( %d, &rozmiar_tablicy ); if( tablica_liczb = (double ) calloc( rozmiar_tablicy, sizeof(double) ) ) for( int i = 0; i < rozmiar_tablicy, i++ ); ( tablica_liczb+i ) = 100; // tablica_liczb[ i ] = 100; free( tablica_liczb ); M. Piasecki, PODSTAWY PROGRAMOWANIA 2 Dynamiczne przydzielanie pamięci

W języku C++ do dynamicznego przydzielania pamięci można nadal wykorzystywać funkcje z biblioteki <alloc.h> ale dużo lepiej jest korzystać z nowych operatorów: new oraz delete <wskaźnik_na_obiekt> = new <typ_obiektu> [parametry_inicjalizacyjne] ; delete <wskaźnik_na_obiekt> ; np. int wsk ; wsk = new(nothrow) int ; if( wsk!= NULL ) wsk = 10 ; printf( %d, wsk ); delete wsk ; // wskaźnik na zmienną typu całkowitego // utworzenie nowego obiektu (nowej zmiennej int) // przypisanie wartości (poprzez wskaźnik) // wydrukowanie zawartości zmiennej dynam. // usunięcie zmiennej dynam. (zwolnienie pamięci) Porównanie utworzenia zwykłej tablicy i tablicy dynamicznej: // operacja utworzenia zwykłej tablicy const int ROZMIAR_TABLICY = 100; double zwykła_tablica[ ROZMIAR_TABLICY ]; // operacja utworzenia i zwolnienia tablicy dynamicznej int rozmiar_tablicy; cout << Ile liczb chcesz wprowadzić: ; cin >> rozmiar_tablicy ; double tablica_dynamiczna = NULL; tablica_dynamiczna = new(nothrow) double[ rozmiar_tablicy ]; tablica_dynamiczna[ i ] = 10.5; double* wsk; try wsk = new double [100 ]; catch( bad_alloc& err ) cout << "Blad: "<< err.what() << endl; cout<<endl<< tablica[ << i+1 << ]= << tablica_dynamiczna[ i ]; delete [ ] tablica_dynamiczna; M. Piasecki, PODSTAWY PROGRAMOWANIA 3 Dynamiczne przydzielanie pamięci

Przykład 1 - pojedyncza realokacja (zmiana rozmiaru) tablicy jednowymiarowej int main( ) // utworzenie 10-cio elementowej tablicy zawierającej liczby z przedziału -50 50 int rozmiar=10; long* tablica = new(nothrow) long[ rozmiar ]; for(int i=0; i< rozmiar; i++) tablica[ i ] = random(101)-50; cout<<endl<<"zawartosc tablicy po wylosowaniu elementów: "<<endl; for (int i=0; i<rozmiar ; i++) cout << endl <<"tab[" << i << "]= " << tablica[ i ]; cout<<endl<<"rozmiar tablicy: "<<rozmiar<<endl; // policzenie ile z wylosowanych liczb ma dodatnią wartość int ilosc_dodatnich=0; for(int i=0; i<rozmiar; i++) if( tablica[i]>0 ) ilosc_dodatnich++; // usunięcie wszystkich liczb ujemnych z jednoczesnym zmniejszeniem tablicy long* nowa_tablica = new(nothrow) long [ilosc_dodatnich]; if( nowa_tablica==null ) cout<<"uwaga - blad tworzenia nowej tablicy"; else int j=0; for(int i=0;i<rozmiar;i++) if( tablica[i]>0 ) nowa_tablica[ j ]=tablica[ i ]; j++; delete [ ] tablica; tablica=nowa_tablica; rozmiar=ilosc_dodatnich; cout<<endl<<"zawartosc tablicy po usunieciu liczb ujemnych:"<<endl; for (int i=0; i<rozmiar ; i++) cout << endl <<"tab[" << i << "]= " << tablica[ i ]; cout<<endl<<"rozmiar tablicy: "<<rozmiar<<endl; cin.get(); delete [ ] tablica; M. Piasecki, PODSTAWY PROGRAMOWANIA 4 Dynamiczne przydzielanie pamięci

Przykład (2) inna wersja programu przykład (1) z wykorzystaniem funkcji bool USUN_UJEMNE(long* &wsk_tablicy, int &rozmiar_tablicy) int ilosc_dodatnich=0; if( wsk_tablicy[i]>0 ) ilosc_dodatnich++; long* nowa_tablica = new(nothrow) long [ilosc_dodatnich]; if( nowa_tablica==null ) return false; int j=0; if( wsk_tablicy[i]>0 ) nowa_tablica[ j ]=wsk_tablicy[ i ]; j++; delete [ ] wsk_tablicy; wsk_tablicy=nowa_tablica; rozmiar_tablicy=ilosc_dodatnich; return true; long* LOSUJ_UJEMNE_i_DODATNIE(int ilosc_liczb); void WYSWIETL(long* tablica, int rozmiar_tablicy); bool USUN_UJEMNE(long* &wsk_tablicy, int &rozmiar_tablicy); int main( ) int n=10; long *tablica = LOSUJ_UJEMNE_i_DODATNIE (n); WYSWIETL( tablica,n); cin.get(); if( USUN_UJEMNE(tablica,n)==false ) cout<<"uwaga - blad operacji usuwania ujemnych"; cout<<endl<<endl<<"po wywolaniu funkcji USUN_UJEMNE:"<<endl; WYSWIETL( tablica,n); cin.get(); delete [ ] tablica; M. Piasecki, PODSTAWY PROGRAMOWANIA 5 Dynamiczne przydzielanie pamięci

dalszy ciąg Przykładu (2) void WYSWIETL(long* tablica, int rozmiar_tablicy) for (int i=0; i<rozmiar_tablicy ; i++) cout << endl <<"tab[" << i << "]= " << tablica[ i ]; cout<<endl<<"rozmiar tablicy: "<<rozmiar_tablicy<<endl; long* LOSUJ_UJEMNE_i_DODATNIE(int ilosc_liczb) long* nowa_tablica = new(nothrow) long[ ilosc_liczb ]; for(int i=0; i<ilosc_liczb ; i++) nowa_tablica[ i ] = random(100)-50; return nowa_tablica; M. Piasecki, PODSTAWY PROGRAMOWANIA 6 Dynamiczne przydzielanie pamięci