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 Report

Transcript 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