1 Czy procesor musi się grzać? Np. dodawanie 2 liczb 1-bitowych. Możliwych stanów początkowych: cztery Możliwych stanów końcowych: dwa to można opisać.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Ćwiczenie (1) Dostosuj poniższy program do potrzeb zdefiniowanych w treści programu zaliczeniowego: #include void dodaj(){}; void edytuj(){}; void usun(){};
Język C/C++ Funkcje.
Programowanie obiektowe
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Static, const, volatile.
PROGRAMOWANIE STRUKTURALNE
Informatyka Stosowana
dynamiczny przydział pamięci
Opisy funkcji Adres strony WWW : html /html_node/libc_528.html.
argumenty wiersza poleceń: getopt
Czy procesor musi się grzać? Np. dodawanie 2 liczb 1-bitowych. Możliwych stanów początkowych: cztery Możliwych stanów końcowych: dwa to można opisać jako.
Uzupełnienie dot. przekazywania argumentów #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct nowa.
formatowanie kodu źródłowego
Funkcje Modularyzacja : program główny , funkcje Funkcje :
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Struktury.
Tablice.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
C++ wykład 2 ( ) Klasy i obiekty.
Ćwiczenie (1) Dostosuj poniższy program do wymogów programu zaliczeniowego #include typedef struct{ char imie[30]; char nazwisko[50]; int rokUrodzenia;
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Podstawy programowania PP – WYK2 Wojciech Pieprzyca.
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka.
Jerzy F. Kotowski1 Informatyka I Wykład 9 TABLICE PREPROCESOR OPERATORY c.d. (nie tylko binarne)
Podstawy informatyki 2013/2014
Informatyka I Wykład 10 WSKAŹNIKI I ADRESY Jerzy F. Kotowski.
TABLICE C++.
Jerzy F. Kotowski1 Informatyka I Wykład 11 STRUKTURY I UNIE.
Podstawy programowania
Podstawy programowania w języku C i C++
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Andrzej Repak Nr albumu
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Podstawy informatyki 2013/2014
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Kurs języka C++ – wykład 3 ( )
Podstawy języka Instrukcje - wprowadzenie
Zmienne i typy danych w C#
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
1 Uzupełnienie dot. przekazywania argumentów #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
1 Opisy funkcji Adres strony WWW : html (należy odszukać hyperlink Function Index) (
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
Switch. Instrukcja switch Składnia instrukcji: switch (wyrażenie){ case wyrażenie_stałe1: ciąg instrukcji dla wariantu 1; break; case wyrażenie_stałe2:
Podstawy informatyki Struktury Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Grzegorz Cygan Wstęp do programowania mikrosterowników w języku C
Czy procesor musi się grzać?
Wskaźniki Elżbieta Labocha.
Opisy funkcji Adres strony WWW :
Typy strukturalne (złożone)
Uzupełnienie dot. przekazywania argumentów
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Przykładowy algorytm geometryczny (geometria płaska)
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
dynamiczny przydział pamięci
Język C++ Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

1 Czy procesor musi się grzać? Np. dodawanie 2 liczb 1-bitowych. Możliwych stanów początkowych: cztery Możliwych stanów końcowych: dwa to można opisać jako zmianę entropii zmiana entropii = (stała Boltzmanna) razy ( ln 4 – ln 2)

2 Czy procesor musi się grzać? przyrost entropii = przyrost ciepła / (temperatura w kelvinach) (dla komputera pracującego w temp. pokojowej 20 stopni Celsjusza temperatura w kelwinach wynosi ) przyrost ciepła = * 1.38e-23 * (ln4-ln2) = 2.80e-21 joula 1 foton światła żołtego ma energię 3.32e-19 joula (długość fali 6.e-7 metra ) czyli około 100 takich dodawań to energia 1 fotonu

3 Czy procesor musi się grzać? granica termodynamiczna dla 1 wata grzania 1wat/ 2.80e-21/ 32 = 1.1e19 dodawań na polu 32 bitowym

4 krótka dygresja nt. struktury struct jedyne operacje jakie można wykonać na strukturze to znalezienie jej adresu (za pomocą operatora &) i odwołanie się do jej elementów (z użyciem operatora. lub kombinacji operatorów * i. albo ich odpowiednika -> (w niektórych kompilatorach można przekazać strukturę jako argument funkcji - także w gcc z ”Free Software Foundation”) &alfa; alfa.pole ; (*ptr_alfa).pole; ptr -> pole ;

5 dygresja nt. struct - ciąg dalszy do pól bitowych struktury nie można stosować operatora & (natomiast jest poprawnym odwołanie przez operator & do elementu struktury który nie jest polem bitowym) & ptr->pole1 ; /* ptr jest wskaźnikiem do struktury */

6 operator przecinkowy /* używany w celu grupowania instrukcji */ k=7,f=13.4, funkcja(z); k= (i=2, j=14, i*j); /* wartość powyższego wyrażenia wynosi 28 */

7 operator przecinkowy #include int main() { int i,k; for(i=0, k=11; i<=10 || k<=13; i+=2, ++k) printf(" i=%3d k=%3d\n", i,k); exit(0); } /* koniec funkcji main */

8 operator przecinkowy Wynik programu: i= 0 k= 11 i= 2 k= 12 i= 4 k= 13 i= 6 k= 14 i= 8 k= 15 i= 10 k= 16

9 operator spoza ortodoksyjnego C && /* adres etykiety ; operator && */ #include int main() {float n=1; char c; void *fp; n: ; ++n; printf("\n n=%f\n",n); scanf("%c",&c); fp= && n; /* to załadowanie fp można umieścić wcześniej... */ goto *fp; } /* koniec funkcji main*/

10 operator spoza ortodoksyjnego C && Jedną z możliwości użycia adresów etykiet jest zainicjalizowanie tablicy o klasie pamięci static; tablica ta będzie przechowywać te adresy jako ”adresy skoków”. static void *array[] = { &&etyk1, &&etyk2, &&etyk3 }; goto *array[i]; /* oczywiście nie będzie sprawdzane czy array[i] zostało zainicjalizowane! */ 1.wydaje się, że instrukcja switch jest wystarczająco bogatym w możliwości rozgałęźnikiem 2.skoki wykonywać można tylko w ramach danej funkcji

11 funkcje zagnieżdżone – tego nie ma w ANSI C int main() { float func(float w, float y); float a,b,c; b=4; c=3; a=func(b,c); printf("\n a=%f\n",a); exit(0); } /* koniec funkcji main*/ float func ( float x1, float x2) { float ff(float f1) { return(f1*f1); } /* koniec funkcji ff, lokalnej wewnatrz func */ return(ff(x1)+ff(x2)); } /* koniec funkcji func gcc –ansi -pedantic ”nazwa zbioru” */

12 (wskaźniki) main() { void funkcja5 ( float** ); float n,*fp; fp = & n; printf("\n poczatek main fp=%p &fp=%p\n", fp, &fp); funkcja5( &fp ); printf("\n koniec main fp=%p &fp=%p\n", fp, &fp); exit(0); } /* koniec funkcji main*/ void funkcja5(float ** wsk) { printf("\n poczatek funkcja5 *wsk=%p wsk=%p &wsk=%p\n", *wsk, wsk, &wsk); *wsk=NULL; printf("\n koniec funkcja5 *wsk=%p wsk=%p &wsk=%p\n", *wsk, wsk, &wsk); } /* koniec funkcji funkcja5 */

13 (wskaźniki) wynik programu : poczatek main fp=0xbfffe754 &fp=0xbfffe750 poczatek funkcja5 *wsk=0xbfffe754 wsk=0xbfffe750 &wsk=0xbfffe740 koniec funkcja5 *wsk=(nil) wsk=0xbfffe750 &wsk=0xbfffe740 koniec main fp=(nil) &fp=0xbfffe750

14 (wskaźniki) inny wynik programu : poczatek main fp=0xbffff154 &fp=0xbffff150 poczatek funkcja5 *wsk=0xbffff154 wsk=0xbffff150 &wsk=0xbffff140 koniec funkcja5 *wsk=(nil) wsk=0xbffff150 &wsk=0xbffff140 koniec main fp=(nil) &fp=0xbffff150

15 Wskaźniki (wskaźnik do funkcji) # include int main() { float func(float w, float y); float a, b=6, c=5; a=(*func) (b,c); printf("\n a=%f\n",a); exit(0); } /* koniec funkcji main*/ float func(float x1, float x2) { return ( x1 * x2 ); } /* koniec funkcji func */

16 Wskaźniki (wskaźnik do funkcji) /* na poprzednim slajdzie mogloby być */ float(*fp) (float a, float b); /* wskaźnik do funkcji */ fp=func; a = (*fp)(b, c); /* wywołanie funkcji */ /* lecz nie może się pojawić func = fp !!! to błąd */ /* func choć jest wskaźnikiem, nie może być zmieniane !! */ /* musi wskazywać na właśnie tą funkcję func !! */

17 kwalifikator volatile volatile int alfa; int volatile alfa; /* gdzie umieszczać kwalifikator ? */

18 kwalifikator volatile Czy kompilator może być „za mądry” i błędnie uznać, że zawartość zmiennej nie mogła się zmienić? Kwalifikator volatile zapobiega takim sytuacjom… (gdy kompilator mógłby błędnie uznać, że np. Zmienna nie miała powodu się zmienić!)

19 kwalifikator volatile #include int main() { struct nowa { int f; int k; }; volatile struct nowa reprezentant2; struct nowa volatile reprezentant3; /* kolejność ? */

20 kwalifikator const const float liczba_pi = 3.14; liczba_pi = 3.142; /* kompilator to zauważa, zgłasza fatalny błąd */

21 kwalifikator const #include int main ( ) { char buf[] = "lasso"; char * war; const char * wsk="Rak"; printf("\n %s\n",wsk); war=(char *) wsk; wsk=(const char *) buf; printf("\n %s %s\n",wsk,war); exit(0); } /* koniec funkcji main */

22 kwalifikator const wynik programu (nie będzie żadnego zastrzeżenia): Rak lasso Rak

23 kwalifikator const #include int main ( ) { char buf[] = "lasso"; char * war; const char * wsk="Rak"; printf("\n %s\n",wsk); war=(char *) wsk; wsk=(const char *) buf; *war='S'; /* dla kompilatora fatalny błąd */ printf("\n %s %s\n",wsk,war); exit(0); } /* koniec funkcji main */

24 kwalifikator const # include int main () { char buf[] = "lasso"; const char rak[]="Rak"; char *wsk, *war; wsk= (char *) rak; rak[0]=‘S'; /* błąd kompilacji ! */ printf("\n %s\n",wsk); war=(char *) wsk; wsk=(char *) buf; strcpy(war,"fa"); /* string copy */ printf("\n\n %s %s\n",wsk, war); exit(0); } /* koniec funkcji main */

25 kwalifikator const error: assignment of read-only location, natomiast jeśli usuniemy kwalifikator const to program się wykona (podczas wykonania nie będzie żadnego ostrzeżenia; wynik wykonania jak poniżej) : Sak lasso fa /* czyli udało się zmienić łańcuch */

26 kwalifikator const #include int main () { const float f=3.14; printf("\n %10.3f\n",f); f=3.142; /* blad kompilacji ! */ printf("\n %10.3f\n",f); exit(0); } /* koniec funkcji main */

27 kwalifikator const (stały wskaźnik) #include int main () { char bufa[40]="Instytucja"; char bufb[40]="Adres"; char * const wsk1=bufa; /* stały wskaźnik */ char * const wsk2=bufb; /* stały wskaźnik */ printf("\n%s %s %p %p",wsk1,wsk2,wsk1,wsk2); strcpy(bufa,"Poczta"); strcpy(bufb,"ul.Witosa 14/2"); printf("\n%s %s %p %p\n",wsk1,wsk2,wsk1,wsk2); exit(0); } /* koniec funkcji main */

28 kwalifikator const (stały wskaźnik) wynik programu : Instytucja Adres 0xbffffa40 0xbffffa18 Poczta ul.Witosa 14/2 0xbffffa40 0xbffffa18

29 kwalifikator const (stały wskaźnik) wsk1+=2; wsk2+=2; /* zmiana wskaźnika stałego, kompilator ostrzega */ printf("\n%s %s %p %p\n",wsk1,wsk2,wsk1,wsk2); error: assignment of read-only variable `wsk1' error: assignment of read-only variable `wsk2‘ (gdyby wsk1 i wsk2 nie były wskaźnikami stałymi to printf wypisałby czta.Witosa 14/2 0xbffffa42 0xbffffa1a )

30 kwalifikator const const int suma; /* zmienna suma jest stałą */ const int * wsk; /* stałą jest zmienna, na którą wskazuje wskaźnik modyfikowalny wsk */ int const * wsk; /* jak powyżej */ int * const wsk; /* wsk jest stałym wskaźnikiem */ const int * const wsk; /* wsk jest stałym wskaźnikiem, może wskazywać na niemodyfikowalną zmienną typu int */

31 kwalifikator const zajmijmy się ostatnim przykładem z poprzedniej folii; czy można jakoś wykorzystać taki wskaźnik ?

32 kwalifikator const #include int main () { const int * const wsk = 0; int ** wsk2; int k=-7; int n=-8; wsk2= (int **) &wsk; (*wsk2)=&k; printf("\n *wsk=%d\n", *wsk); /* wsk=&n; to byłby fatalny blad */ ( *( (int**) (&wsk) ) ) = &n; /* to jest OK !! */ printf("\n *wsk=%d\n", *wsk); exit(0); } /* koniec funkcji main */

33 kwalifikator const (program z poprzedniej folii wypisze to co poniżej; udało się zmienić stały wskaźnik ! ) *wsk=-7 *wsk=-8

34 kwalifikator const /* inny przykład ominiecia kwalifikatora const */ #include int main () { const char buf[] = "masa"; char * wsk; wsk=(char *)buf; (*wsk)='k'; printf("\n %s\n",buf); /* wydrukuje kasa */ exit(0); } /* koniec funkcji main */

35 kwalifikator const Używać const, czy może raczej #define ? const ma składnię języka C (można zdefiniować np. stałą strukturę struct ) #define ma składnię preprocesora

36 Długości wskaźników #include struct st{char buf[100000];}; /* to tylko deklaracja! */ int main() { printf("\n%d”, sizeof( char *) ); printf("\n%d”, sizeof( int *) ); printf("\n%d”, sizeof( double *) ); printf("\n%d”, sizeof( struct st *) ); printf("\n%d”, sizeof( const struct st *) ); printf("\n%d”, sizeof( struct st (*)(float,float) ) ); printf("\n%d\n", sizeof( short *) ); } /* koniec funkcji main*/

37 argumenty wiersza poleceń funkcja main ma dwa argumenty main(int argc, char * argv [ ] ) (tak sa zwyczajowo nazywane, choć nie są to nazwy obowiązujące)

38 argumenty wiersza poleceń funkcja main ma dwa argumenty main(int argc, char * * argv ) (tak sa zwyczajowo nazywane, choć nie są to nazwy obowiązujące)

39 argumenty wiersza poleceń #include int main (int argc, char *argv[] ) /* albo int main( int argc, char **argv) */ { int n; for(n=0;n<argc; ++n) { printf("\n n=%d param= %s",n, argv[n]); printf("\n to samo... n=%d param= %s",n, *(argv+n) ); printf("\n"); } exit(0); } /* koniec funkcji main */

40 argumenty wiersza poleceń #include int main(int argc, char **argv) { if(argc>=3 && strcmp("alfa", *(argv+2))==0) printf("\n parametr alfa\n"); exit(0); } /* koniec funkcji main*/ a.out abcdef alfa /* jeśli takie wywołanie, to..... */

41 argumenty wiersza poleceń a.out ”jedna spacja” a.out ”apostrof’” a.out ’inny_apostrof”’ ’ np. aby przesłać łańcuch 4-znakowy a” ’ a.out ’a” ’”’” (pojedynczy apos., a, podwójny apos., spacja, pojedynczy apos., podwójny apos., pojedynczy apos., podwójny apos.)