Jerzy F. Kotowski 1
Informatyka IWykład 12
GOSPODARKA PAMIĘCIĄ,
STRUMIENIE (i nie tylko)
Jerzy F. Kotowski 2
TROCHĘ TAJEMNIC
char A[12]=“Ala ma kota”;
Ala ma kota obiekt A[12]
kopiowanie
char *B=“Ala ma kota”;
Ala ma kota wskaźnik
*BAdres
printf(“Ala ma kota”); - argumentem jest adres!!
char C[ ]=“Ala ma kota”; - policz sobie sam ?!?!
C[ ]
Jerzy F. Kotowski 3
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)
12_1
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 wierszytablicy 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
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 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
12_2
Jerzy F. Kotowski 9
Strumienie wejściowe i wyjściowe
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).
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);
FILE *fopen(const char *filename, const char *mode);
Tryby:
r w a b t
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 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 14
Merry Christmas
and a Happy New Year 2006