Informatyka I Wykład 12

14
Jerzy F. Kotowski 1 Informatyka I Wykład 12 GOSPODARKA PAMIĘCIĄ, STRUMIENIE (i nie tylko)

description

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!!. - PowerPoint PPT Presentation

Transcript of Informatyka I Wykład 12

Page 1: Informatyka I Wykład 12

Jerzy F. Kotowski 1

Informatyka IWykład 12

GOSPODARKA PAMIĘCIĄ,

STRUMIENIE (i nie tylko)

Page 2: Informatyka I Wykład 12

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[ ]

Page 3: Informatyka I Wykład 12

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

Page 4: Informatyka I Wykład 12

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’;

Page 5: Informatyka I Wykład 12

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

Page 6: Informatyka I Wykład 12

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++

Page 7: Informatyka I Wykład 12

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

Page 8: Informatyka I Wykład 12

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

Page 9: Informatyka I Wykład 12

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).

Page 10: Informatyka I Wykład 12

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

Page 11: Informatyka I Wykład 12

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);

Page 12: Informatyka I Wykład 12

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

Page 13: Informatyka I Wykład 12

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:

Page 14: Informatyka I Wykład 12

Jerzy F. Kotowski 14

Merry Christmas

and a Happy New Year 2006