Informatyka I Wykład 12 GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko) Jerzy F. Kotowski TROCHĘ TAJEMNIC char A[12]=“Ala ma kota”; kopiowanie Ala ma kota char *B=“Ala ma kota”; obiekt A[12] C[
Download ReportTranscript Informatyka I Wykład 12 GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko) Jerzy F. Kotowski TROCHĘ TAJEMNIC char A[12]=“Ala ma kota”; kopiowanie Ala ma kota char *B=“Ala ma kota”; obiekt A[12] C[
Slide 1
Informatyka I
Wykład 12
GOSPODARKA PAMIĘCIĄ,
STRUMIENIE (i nie tylko)
Jerzy F. Kotowski
1
Slide 2
TROCHĘ TAJEMNIC
char A[12]=“Ala ma kota”;
kopiowanie
Ala ma kota
char *B=“Ala ma kota”;
obiekt A[12]
C[ ]
wskaźnik
Ala ma kota
Adres
*B
printf(“Ala ma kota”); - argumentem jest adres!!
char C[ ]=“Ala ma kota”; - policz sobie sam ?!?!
Jerzy F. Kotowski
2
Slide 3
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]
Jerzy F. Kotowski
*(a + i)
3
Slide 4
Uchylanie tajemnicy c.d.
char s[3][5] = {“Ala”, “ma”, “kota”};
Ala
ma
Kopiowanie
kota
s[0] s[1] s[2]
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 ma kota
v[0] 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
4
Slide 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
5
Slide 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
6
Slide 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
7
Slide 8
12_2
Program info_12_2.cpp
F-cja void menu(void)
oraz void menu(void)
Tab. jednowymiarowa
• Tablica adresów jest
zakładana dynamicznie
• Nie wolno zapominać o
zwalnianiu pamięci - może
to być trudne
• void error(char *tekst)
• Wywołanie funkcji scanf
• Zwalnianie pamięci
Tablica dwuwymiarowa
• Tablica adresów do
wierszy jest automatyczna
• Można zapomnieć o zwolnieniu zajętego obszaru
Pełne szaleństwo
Niech żyje destruktor!!!
Zachowanie funkcji
scanf przy wprowadzaniu kilku wyrazów.
Bufor klawiatury
Jerzy F. Kotowski
8
Slide 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.
• stdin
standard input device
• stdout
standard output devive
• stdprn
standard printer
• …………..
• nasze własne (np. pliki).
Jerzy F. Kotowski
9
Slide 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
10
Slide 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);
Przykład:
scanf(”%d”,&i);
char ss[100];
FILE *f = fopen(“dane”,”rt”);
fscanf(f,”%s”,ss);
fclose(f);
Jerzy F. Kotowski
11
Slide 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
12
Slide 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:
……………….
Jerzy F. Kotowski
case Esc:
13
Slide 14
Merry Christmas
and a Happy New Year 2006
Jerzy F. Kotowski
14
Informatyka I
Wykład 12
GOSPODARKA PAMIĘCIĄ,
STRUMIENIE (i nie tylko)
Jerzy F. Kotowski
1
Slide 2
TROCHĘ TAJEMNIC
char A[12]=“Ala ma kota”;
kopiowanie
Ala ma kota
char *B=“Ala ma kota”;
obiekt A[12]
C[ ]
wskaźnik
Ala ma kota
Adres
*B
printf(“Ala ma kota”); - argumentem jest adres!!
char C[ ]=“Ala ma kota”; - policz sobie sam ?!?!
Jerzy F. Kotowski
2
Slide 3
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]
Jerzy F. Kotowski
*(a + i)
3
Slide 4
Uchylanie tajemnicy c.d.
char s[3][5] = {“Ala”, “ma”, “kota”};
Ala
ma
Kopiowanie
kota
s[0] s[1] s[2]
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 ma kota
v[0] 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
4
Slide 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
5
Slide 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
6
Slide 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
7
Slide 8
12_2
Program info_12_2.cpp
F-cja void menu(void)
oraz void menu(void)
Tab. jednowymiarowa
• Tablica adresów jest
zakładana dynamicznie
• Nie wolno zapominać o
zwalnianiu pamięci - może
to być trudne
• void error(char *tekst)
• Wywołanie funkcji scanf
• Zwalnianie pamięci
Tablica dwuwymiarowa
• Tablica adresów do
wierszy jest automatyczna
• Można zapomnieć o zwolnieniu zajętego obszaru
Pełne szaleństwo
Niech żyje destruktor!!!
Zachowanie funkcji
scanf przy wprowadzaniu kilku wyrazów.
Bufor klawiatury
Jerzy F. Kotowski
8
Slide 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.
• stdin
standard input device
• stdout
standard output devive
• stdprn
standard printer
• …………..
• nasze własne (np. pliki).
Jerzy F. Kotowski
9
Slide 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
10
Slide 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);
Przykład:
scanf(”%d”,&i);
char ss[100];
FILE *f = fopen(“dane”,”rt”);
fscanf(f,”%s”,ss);
fclose(f);
Jerzy F. Kotowski
11
Slide 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
12
Slide 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:
……………….
Jerzy F. Kotowski
case Esc:
13
Slide 14
Merry Christmas
and a Happy New Year 2006
Jerzy F. Kotowski
14