Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałWacława Kamieniak Został zmieniony 11 lat temu
1
GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko)
Informatyka I Wykład 12 GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko) Jerzy F. Kotowski
2
TROCHĘ TAJEMNIC char A[12]=“Ala ma kota”; kopiowanie Ala ma kota
obiekt A[12] char *B=“Ala ma kota”; C[ ] Ala ma kota wskaźnik *B Adres printf(“Ala ma kota”); - argumentem jest adres!! char C[ ]=“Ala ma kota”; - policz sobie sam ?!?! Jerzy F. Kotowski
3
Uchylanie (rąbka) tajemnicy
12_1 Uchylanie (rąbka) tajemnicy type *ident; Û type ident[ ]; Przykład: double Ula[ ]; Û double *Ula; Użycie identyczne jak w przypadku “prawdziwej” tablicy: Ula[1]; Û Ela[1]; 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) Jerzy F. Kotowski
4
Uchylanie tajemnicy c.d.
char s[3][5] = {“Ala”, “ma”, “kota”}; Ala s[0] ma kota s[1] s[2] Kopiowanie do kolejnych wierszy tablicy s 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. Ala v[0] ma kota v[1] v[2] Podstawianie adresów do wskaźników Użycie identyczne: v[0][0]=‘E’; v[2][2]=‘s’; Jerzy F. Kotowski
5
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
6
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
7
malloc - free new - delete
Przykłady użycia 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); Narzędzia muszą być “do pary”, tzn.: malloc - free new - delete Jerzy F. Kotowski
8
Program info_12_2.cpp 12_2 F-cja void menu(void) oraz void menu(void)
Tab. jednowymiarowa void error(char *tekst) Wywołanie funkcji scanf Zwalnianie pamięci Tablica dwuwymiarowa Tablica adresów do wierszy jest automatyczna Można zapomnieć o zwol-nieniu zajętego obszaru 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 Jerzy F. Kotowski
9
Strumienie wejściowe i wyjściowe
Otoczenie procesora: Wejście klawiatura dysk mysz skaner Wyjście monitor drukarka Strumienie - predefined streams automatically opened when the program is started. stdin standard input device stdout standard output devive stdprn standard printer ………….. nasze własne (np. pliki). Jerzy F. Kotowski
10
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
11
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
12
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
13
Kilka przykładów Program inf_12_3.cpp
tekst_z_klawiatury czyta 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 F #define Shift_F #define Ctrl_F #define Esc 27 ………………………… switch(p) { case F1: ………………. case Ctrl_F1: case Esc: Jerzy F. Kotowski
14
Merry Christmas and a Happy New Year 2006 Jerzy F. Kotowski
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.