140 likes | 298 Views
Informatyka I Wykład 12. GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko). kopiowanie. Ala ma kota. obiekt A[12]. Ala ma kota. wskaźnik *B. Adres. TROCHĘ TAJEMNIC. char A[12]=“Ala ma kota”;. char *B=“Ala ma kota”;. C[ ]. printf(“Ala ma kota”); - argumentem jest adres!!.
E N D
Informatyka IWykład 12 GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko) Jerzy F. Kotowski
kopiowanie Ala ma kota obiekt A[12] Ala ma kota wskaźnik *B Adres TROCHĘ TAJEMNIC • char A[12]=“Ala ma kota”; • char *B=“Ala ma kota”; C[ ] • printf(“Ala ma kota”); - argumentem jest adres!! • char C[ ]=“Ala ma kota”; - policz sobie sam ?!?! Jerzy F. Kotowski
12_1 Uchylanie (rąbka) tajemnicy • Dodatkowa możliwość:int Ula[ ] = {3,5.3,4.1,-5}; • int *Ala = {3,5.3,4.1,-5}; • int Ela[4] = {3,5.3,4.1,-5}; • Ala++; OK!! • Ula++; !!! ERROR • Ela++; !!! ERROR • Są to konsekwencje wzoru a[i] º *(a + i) • type *ident; Û type ident[ ]; • Przykład: • double Ula[ ]; Û double *Ula; • Użycie identyczne jak w przypadku “prawdziwej” tablicy: Ula[1]; Û Ela[1]; Jerzy F. Kotowski
Ala ma kota s[0] s[1] s[2] Kopiowanie do kolejnych wierszy tablicy s Ala ma kota v[0] v[1] v[2] Podstawianie adresów do wskaźników Uchylanie tajemnicy c.d. • char s[3][5] = {“Ala”, “ma”, “kota”}; • char ss[ ][5] = {“Ala”, “ma”, “kota”}; - policz sam!? • Alternatywa: char *v[3] = {“Ala”, “ma”, “kota”};- v jest tablicą wskaźników do obiektów typu char. • Użycie identyczne: v[0][0]=‘E’; v[2][2]=‘s’; Jerzy F. Kotowski
Dynamiczna alokacja pamięci • double *p = malloc(100*sizeof(double)); • Prototyp w alloc.h i w stdlib.h:void *malloc(size_t size); • (...Returns a pointer to the newly allocated block, or NULL if not enough space exists for the new block…) • Inne funkcje (wybrane):allocmem farmalloc calloc free • Wybór funkcji zależeć może od potrzeb oraz używanego modelu pamięci:Tiny Small Medium Compact Large Huge Jerzy F. Kotowski
Dynamiczna alokacja pamięci - C++ • double *p = new double[100]; • Składnia:pointer_to_name = new name [name_initializer]; • Niesamowicie ważne: The storage duration ot the new object is from the point of creation until the operator delete deallocates its memory, or until the end of the program. • To znaczy, że zajęty obszar trzeba koniecznie zwalniać własnymi rękoma: delete(p); • new delete - operatory jednoargumentowe (wiadomo jaki prirytet) języka C++ Jerzy F. Kotowski
Składnia C: char *Ala = malloc(12); strcpy(Ala,”Ala ma kota); Ala[0]=‘U’; free(Ala); Składnia C++: char *Ala = new char[12]; strcpy(Ala,”Ala ma kota); Ala[0]=‘U’; delete(Ala); Przykłady użycia • Narzędzia muszą być “do pary”, tzn.: • malloc - freenew - delete Jerzy F. Kotowski
12_2 Program info_12_2.cpp • Pełne szaleństwo • Tablica adresów jest zakładana dynamicznie • Nie wolno zapominać o zwalnianiu pamięci - może to być trudne • Niech żyje destruktor!!! • Zachowanie funkcji scanf przy wprowadza-niu kilku wyrazów. • Bufor klawiatury • F-cja void menu(void) • oraz void menu(void) • Tab. jednowymiarowa • void error(char *tekst) • Wywołanie funkcjiscanf • Zwalnianie pamięci • Tablica dwuwymiarowa • Tablica adresów do wierszy jest automatyczna • Można zapomnieć o zwol-nieniu zajętego obszaru Jerzy F. Kotowski
Otoczenie procesora: Wejście klawiatura dysk mysz skaner Wyjście monitor drukarka dysk Strumienie- predefined streams automatically opened when the program is started. stdinstandard input device stdoutstandard output devive stdprnstandard printer ………….. nasze własne (np. pliki). Strumienie wejściowe i wyjściowe Jerzy F. Kotowski
Obsługa strumienia wyjściowego • Wprowadzanie do strumienia wyjściowego • czym(gdzie, jak, co); • int fprintf(FILE *stream, char *format [, arg,…]); fprintf(stdout,”Ala ma kota”);ºprintf(“Ala ma kota”); fprintf(stdprn,”Ala ma kota”); - wydruk na drukarkę FILE *f = fopen(“Ala.cpp”,”a”); fprintf(f,”Ala ma kota”); fclose(f); Tryby: r w a b t FILE *fopen(const char *filename, const char *mode); Jerzy F. Kotowski
Obsługa strumienia wejściowego • Wczytywanie ze strumienia wyjściowego • czym(skąd, jak, co); • int fscanf(FILE *stream, char *format[, adress,…]); • fscanf(stdin,”%d”,&i);ºscanf(”%d”,&i); • Przykład: char ss[100]; FILE *f = fopen(“dane”,”rt”); fscanf(f,”%s”,ss); fclose(f); Jerzy F. Kotowski
Kilka funkcji do odczytu ze strumieni a z klawiatury w szczególności • int getc(FILE *stream);gets one character from a stream • int getchar(void);gets character from stdin. It is line buffered. This means it will not return until you press ENTER. • int getch(void); int getche(void); (echo)gets character from console. It is line buffered. This means it will not return until you press ENTER. • int bioskey(int cmd);Keyboard interface Jerzy F. Kotowski
Kilka przykładów • Program inf_12_3.cpp • tekst_z_klawiaturyczyta bufor klawiatury • Odczyt rozpoczyna naciśnięcie ENTER. • Pobieranie znaków kończy pobranie znaku ‘char c’ - 2 argument • W buforze może coś zostać • Program inf_12_4.cpp • GetKey - naciśnięte klawisze • Można przetestować samemu. • #define F1 15104 • #define Shift_F1 21504 • #define Ctrl_F1 24064 • #define Esc 27 • ………………………… • switch(p) • { • case F1: • ………………. • case Ctrl_F1: • ………………. • case Esc: Jerzy F. Kotowski
Merry Christmas and a Happy New Year 2006 Jerzy F. Kotowski