ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C klasy pamięci ISO/ANSI C. ISO/ANSI C klasy pamięci. ISO/ANSI C klasy pamięci

Podobne dokumenty
ISO/ANSI C klasy pamięci ISO/ANSI C. ISO/ANSI C klasy pamięci. ISO/ANSI C klasy pamięci. Pamięć programu. ISO/ANSI C klasy pamięci

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

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

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

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

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

Wskaźniki. Programowanie Proceduralne 1

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.

Uzupełnienie dot. przekazywania argumentów

Struktury. Przykład W8_1

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

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

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

Biblioteka standardowa - operacje wejścia/wyjścia

Programowanie w języku C++

Ghost in the machine

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Struktury czyli rekordy w C/C++

Wskaźniki. Informatyka

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

Stałe i zmienne znakowe. Stała znakowa: znak

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

Podstawy programowania w języku C++

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

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy programowania komputerów

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

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

Tablice deklaracja, reprezentacja wewnętrzna

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

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

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.

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

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

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

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

Wprowadzenie do programowania w języku C

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

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

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

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

Lab 9 Podstawy Programowania

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

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

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

Podstawy programowania w języku C++

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

Zmienne i struktury dynamiczne

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

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:

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

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

Wykład 4: Klasy i Metody

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Podstawy programowania w języku C++

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

Język ludzki kod maszynowy

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Programowanie Proceduralne

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

Podstawy programowania w języku C++

Wstęp do programowania 1

Wskaźniki w C. Anna Gogolińska

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

Programowanie i struktury danych

Tablice, funkcje - wprowadzenie

ŁAŃCUCHY W JĘZYKU C/C++

Pobieranie argumentów wiersza polecenia

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

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

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

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

Języki i techniki programowania Ćwiczenia 2

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

Wprowadzenie do programowania w języku C

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Wstęp do programowania

Spis treści JĘZYK C - PLIKI BINARNE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF30

Język C zajęcia nr 11. Funkcje

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

Zasady programowania Dokumentacja

Podstawy programowania w języku C++

Stałe, tablice dynamiczne i wielowymiarowe

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

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Język C++ wykład VIII

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

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

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

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

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

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

Transkrypt:

ISO/ANSI C ostęp o plików ISO/ANSI C ostęp o plików Tryb binarny size_t frea( voi *buffer, size_t size, size_t count, FILE *stream ); size_t fwrite( const voi *buffer, size_t size, size_t count, FILE *stream ); Oczytuje lub zapisuje określoną liczbę porcji anych o/z bufora azywanego przez buffer z/o pliku azywanego przez stream Zwraca liczbę porcji wczytanych/zapisanych. Jeżeli liczba nie zgaza się z zaeklarowaną, to w przypaku oczytu znaczy, że być może w pliku było mniej anych niż się spoziewano, lub wystąpił błą oczytu (należy użyć funkcji feof lub ferror, żeby to rozstrzygnąć) 111 ISO/ANSI C Klasy pamięci Zmienne mogą być efiniowane z moyfikatorami: auto, extern, static auto zmienna lokalna istniejąca tylko w obrębie bloku: tworzona w momencie gy sterowanie wchozi o anego bloku i usuwana gy opuszcza (wszystkie zmienne zaeklarowane w obrębie bloku są z efinicji lokalne, latego tego moyfikatora się nie używa). extern eklaracja zmiennej zefiniowanej w innym pliku (la kou programu, który jest pozielony na pliki) static zmienne statyczne, istniejące w jenym egzemplarzu 113 Czym różnią się zmienne static o globalnych? Zmienne static są wiziane tylko w moule/pliku, w którym zostały zaeklarowane; nie można się o nich owołać z innego pliku za pomocą extern zmienna static zaeklarowana w bloku nie jest usuwana po wyjściu z tego bloku. Po powrocie sterowania o tego bloku wartość zmiennej static jest zachowana 114 zmienne volatile może ulec zmianie bez wiezy programu, np. ponieważ reprezentuje obszar anych bęący po kontrolą interfejsu o urzązenia zewnętrznego, lub gy programujemy wielowątkowo i zmienna pozwala na wymianę informacji mięzy wątkami Kompilator traktują ją jako niewną, tj. prze każym użyciem oczytuje jej wartość z pamięci (a nie np. z cache u), a każa moyfikacja musi zostać wykonana prze przystąpieniem o wykonania następnych instrukcji (żanego przyspieszania wykonania programu przy pomocy potokowego wykonania instrukcji przez zaawansowany procesor, itp.) 115 1

zmienne const wartość zmiennej nie może ulec zmianie po jej utworzeniu jest inicjalizowana w momencie jej efiniowania Komentarz na marginesie: moyfikator const wykorzystywany jest również przy eklarowaniu argumentów funkcji la zagwarantowania nietykalności zmiennych poawanych w argumentach wykonania, np.: char *strcpy( char *strdestination, const char *strsource ); Uwaga: typ char* to nie to samo co const char* Pamięć programu Pamięć jest pozielona na cztery segmenty: ane, sterta, stos i ko zmienne globalne ane zmienne statyczne ane zmienne const ko i/lub ane zmienne lokalne (zaeklarowane i zefiniowane w funkcjach) stos zmienne zaeklarowane i zefiniowane w main stos aźniki ane lub stos, w zależności o kontekstu pamięć alokowana ynamicznie sterta 116 117 ISO/ANSI C Zmienne ynamiczne Zmienne eklarowane w kozie programu są tworzone: w momencie uruchomienia programu (zmienne globalne), lub w momencie wejścia sterowania o bloku instrukcji, w którym zostały zaeklarowane (zmienne lokalne) Zmienne te są ientyfikowane przez nazwy Programista musi przewizieć, ile zmiennych bęzie potrzebował la swojego algorytmu A co robić, jeżeli zarzy się, że programista nie jest w stanie tego przewizieć? 119 Sytuacje, kiey nie wiemy nic wnego o rozmiarze zbioru anych, na którym bęziemy orować: praca na anych z pliku (rozmiar pliku nie jest znany) wczytywanie anych, co o których nie znamy ograniczenia na ilość (wprowazanie faktur, prouktów o cennika) obiór anych z interfejsu zewnętrznego (billingi telefoniczne, w meycynie: pomiary ciągłe stanu pacjenta temratura, tętno, itp.) Algorytm musi być przygotowany na to, że opiero w trakcie ziałania owie się, jaki jest rozmiar anych roboczych i musi umieć opowienio o tego rozmiaru na bieżąco przygotować struktury anych na jego przyjęcie Dynamiczne ostosowanie się programu o anych wejściowych jest możliwe z pomocą zmiennych ynamicznych. Zmienne ynamiczne są tworzone w trakcie ziałania programu za pomocą polecenia alokacji anych. Ich rozmiar może być określony opiero czasie ziałania programu (nie musi być wcześniej znany programiście), a po ich wykorzystaniu, zaalokowany obszar pamięci można zwolnić i z powrotem oać o yspozycji systemowi. Alokowanie zmiennej ynamicznej (<stlib.h> i <malloc.h>): voi* malloc( size_t size ); Funkcja zwraca ares o obszaru pamięci o rozmiarze size. Zwracany typ voi* pozwala na zapisanie wyniku o zmiennej aźnikowej owolnego typu. 120 121 2

Przykła: char *string1 = malloc( 80 ); if( string1 == NULL ) printf("brak wystarczającej ilości pamięci\n"); else printf("zaalokowano zmienną ynamiczną\n"); Aby zagwarantować przenośność kou, zamiast samemu obliczać całkowity rozmiar pamięci, lepiej wykorzystać funkcję sizeof: string1 = malloc( 80 *sizeof(char) ); Usuwanie zaalokowych zmiennych Kiey zmienna przestaje być potrzebna zaalokowane zasoby pamięci należy zwolnić. voi free( voi *memblock ); Argumentem wywołania jest aźnik na zmienną. Zapominanie o zwalnianiu zaalokowanych zasobów jest typowym błęem, powouje, że w trakcie pracy aplikacji zużywa ona coraz więcej i więcej zasobów. Takie zjawisko jest nazywane wyciekaniem pamięci. 122 123 Usuwanie zaalokowych zmiennych Przykła: char *string1 = malloc( 80 ); if( string1 == NULL ) printf( Brak wystarczającej ilości pamięci\n" ); else { printf( Zaalokowano zmienną ynamiczną\n" ); /* ko programu wykorzystujący zaalokowaną zmienną */ free( string1 ); Rozmiar zaalokowanej pamięci jest zawarty w oatkowym, niewielkim nagłówku ołączonym o obszaru zaalokowanego przez malloc. Dlatego funkcja free nie musi rozpoznawać rozmiaru pamięci o zwolnienia po typie aźnika. Zgubienie aźnika o zmiennej ynamicznej powouje całkowitą utratę kontroli na tą zmienną, ale nie zwalnia zasobów. Przykła z tablicami ynamicznymi: ouble * t1 = malloc(100*sizeof(ouble)); ouble * t2 = malloc(100*sizeof(ouble)); /* zamieniamy się tablicami */ t1 = t2; t2 = t1; /* Bez sensu. Tak się nie robi.. */ /* prawiłowo zamieniamy się tablicami */ ouble *t3; /* tworzymy zmienną pomocniczą t3 */ t3 = t1; t1 = t2; t2 = t3; /* zamieniamy */ 124 125 Dwuwymiarowe tablice ynamiczne Alokowanie: int i; ouble **t1 = malloc(100*sizeof(ouble*)); for (i=0; i<100; i++) t1[i] = malloc(100*sizeof(ouble)); Zwalnianie: int i; for (i=0; i<100; i++) free( t1[i] ); free( t1 ); Alokowanie i inicjalizacja zerami voi *calloc( size_t num, size_t size ); long *buffer; buffer = calloc( 40, sizeof( long ) ); if (buffer == NULL) { printf( "Can't allocate memory\n" ); exit(1); /* ziałania na zmiennej buffer */ free( buffer ); 126 127 3

Zmiana rozmiaru zaalokowanego bloku voi *realloc(voi *memblock, size_t size); long *buffer; buffer = malloc( 1000 * sizeof( long ) ); if (buffer == NULL) exit( 1 ); /* Realokacja */ buffer = realloc( buffer, 2000 * sizeof( long )); if (buffer == NULL) exit( 1 ); Zwraca ares o tego samego bloku pamięci, jeżeli uało się go rozszerzyć. Zwraca NULL jeżeli poano size=0 a memblock!=null, bąź jeżeli nie uało się rozszerzyć zaalokowanego bloku o żąanych rozmiarów. Jeżeli poano memblock==null, ziała jak zwykły malloc. 128 voi *memcpy( voi *est, const voi *src, voi *memmove( voi *est, const voi *src, Kopiuje z obszaru pamięci azanego przez src liczbę count bajtów o obszaru pamięci azanego przez est memcpy szybsze (różnica wioczna przy wielkich rozmiarach anych kopiowanych po wielokroć) memmove zabezpiecza poprawne ziałanie w przypaku, kiey azane obszary pamięci mogą się częściowo pokrywać 129 voi *memcpy( voi *est, const voi *src, voi *memmove( voi *est, const voi *src, Przykła: char tab[] = "Lorem ipsum olor sit amet, consectetur aipisicing elit"; char*ptab = calloc(100,sizeof(char)); int i = sizeof(tab); /* zwróci rozmiar całej tablicy */ memcpy(ptab,tab, i); /* tak jest szybciej: */ memmove(tab+5,tab, i); /* tak bezpieczniej: */ 130 Dygresja: ziałanie funkcji sizeof( ) la tablic i aźników - Zwraca rozmiar całej tablicy (w bajtach) tylko jeżeli kompilator jenoznacznie ientyfikuje argument jako tablicę: char tab[] = "Zakopane na pokaz"; int i = sizeof(tab); // i = 18 (tablica rozpoznana!) long ouble *ptab = calloc(100, sizeof(long ouble)); ptab[0] = sizeof(ptab); // ptab[0] = 4 ptab[1] = sizeof(*ptab); // ptab[1] = 8 - Jeżeli tablicę przekażemy jako argument wywołania funkcji np.: voi fun(char *w) tj. zostanie przekazana za pomocą argumentu typu aźnik, to sizeof(w) wywołany w kozie funkcji zwróci rozmiar zmiennej aźnikowej 131 Porównanie znaków w wóch buforach: int memcmp( const voi *buf1, const voi *buf2, char first[] = "12345678901234567890"; char secon[] = "12345678901234567891"; int result = memcmp( first, secon, 19 ); if( result < 0 ) printf( Pierwszy jest mniejszy niż rugi.\n" ); else if( result == 0 ) printf( Pierwszy i rugi są równe.\n" ); else printf( Pierwszy jest większy niż rugi.\n" ); Wyłnienie bufora znakami: voi *memset( voi *est, int c, char buffer[] = To tylko taki mały test memset"; printf( Prze: %s\n", buffer ); memset( buffer, '*', 14 ); printf( Po: %s\n", buffer ); Prze: To tylko taki mały test memset Po: **************mały test memset 132 133 4

Rekurencyjne typy anych ISO/ANSI C Zmienne ynamiczne: Rekurencyjne typy anych struct element { ouble ; struct element * ; 135 Rekurencyjne typy anych struct element { ouble ; struct element * ; ; struct element * = malloc(sizeof(struct element)); -> = malloc(sizeof(struct element)); Wskaźników używa się np. o buowy grafów skończonych, rzew, list (jeno- i wukierunkowych) i o manipulacji na nich. Poniżej pokazany jest przykła listy interpretowanej jako graf liniowy zorientowany. struct element { struct Dane_t ane; struct element * ; 136 137 Lista jest szczególnym przypakiem rekurencyjnego typu anych, w którym przyjmuje się, że: zbiór pusty wierzchołków jest listą, jeśli h jest wierzchołkiem listy, a t jest listą, to para uporząkowana (h,t) jest listą, w której h jest nazywana głową listy, a t ogonem listy. Lista jest szczególnym przypakiem rekurencyjnego typu anych, w którym przyjmuje się, że: zbiór pusty wierzchołków jest listą, jeśli h jest wierzchołkiem listy, a t jest listą, to para uporząkowana (h,t) jest listą, w której h jest nazywana głową listy, a t ogonem listy. 138 139 5

Głową listy może być zmienna aźnikowa, przechowująca ares pierwszego elementu listy, np.: struct element* gp; // notacja ANSI C element *gp; // notacja C++ Tworzenie nowej listy glowa lub zmienna typu struct, np.: struct element g; element g; // notacja ANSI C // notacja C++ Początek wstawiania W rugim przypaku głowa listy jest jenocześnie pierwszym elementem przechowującym ane 140 141 Tworzenie nowej listy 1. utwórz aźniki: na głowę listy glowa, oraz na ostatni element listy. 2. while (są ane o wprowazenia) { 1. utwórz nowy element listy 2. jeżeli glowa nie azuje na nic, niech glowa i azują na nowy element. W przeciwnym przypaku niech pole aźnikowe elementu listy azywanego przez azuje na nowy. Następnie zmień tak, aby również azywał na nowy 3. wyłnij anymi zawartość nowego elementu 4. zapisz NULL w polu azującym na następny element listy w nowym elemencie glowa glowa Prze ołączeniem: Po ołączeniu: 142 143 Przykłaowy program tworzący listę struct film_t { char tytul[80]; int rok; struct film_t *nast; ; struct film_t *, *glowa = NULL; char tytul[80]; int rok; FILE* stream; if( (stream = fon( "filmy.txt", "r" )) == NULL ) exit(1); /* zakłaamy, że w pliku filmy.txt wiersze zawierają tytuł i rok proukcji. Tytuł jest jenym slowem */ fscanf(stream, "%s %i", tytul, &rok); while (!feof( stream )) { if (glowa == NULL) glowa = = malloc(sizeof(struct film_t)); else { ->nast = malloc(sizeof(struct film_t)); = ->nast; strcpy(->tytul,tytul); ->rok = rok; ->nast = NULL; fscanf(stream, "%s %i", tytul,&rok); 144 fclose(stream); 6