Czy procesor musi się grzać?

Podobne dokumenty
nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Uzupełnienie dot. przekazywania argumentów

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do Programowania, laboratorium 02

Języki i metodyka programowania. Wprowadzenie do języka C

Programowanie Proceduralne

Wskaźniki. Informatyka

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Stałe i zmienne znakowe. Stała znakowa: znak

Tablice, funkcje - wprowadzenie

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Zmienne, stałe i operatory

Tablice, funkcje, wskaźniki - wprowadzenie

Część 4 życie programu

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Wskaźniki w C. Anna Gogolińska

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Opisy funkcji /html_node/libc_528.html

Wstęp do programowania 1

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Przekazywanie argumentów wskaźniki

Programowanie strukturalne i obiektowe

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Języki i metodyka programowania. Wskaźniki i tablice.

Dariusz Chaberski. UMK Toruń

PROGRAMOWANIE w C prolog

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Podstawy programowania C. dr. Krystyna Łapin

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Argumenty wywołania programu, operacje na plikach

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

5 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Języki i metody programowania. Omówienie języków C, C++ i Java

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Pobieranie argumentów wiersza polecenia

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

dr inż. Jarosław Forenc

Język ANSI C tablice wielowymiarowe

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Stałe, tablice dynamiczne i wielowymiarowe

Co nie powinno być umieszczane w plikach nagłówkowych:

Wykład 1

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Wstęp do wskaźników w języku ANSI C

Podstawy Programowania Podstawowa składnia języka C++

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

PARADYGMATY PROGRAMOWANIA Wykład 4

WYKŁAD 4, 5 i 6. Wprowadzenie do języka C Mój pierwszy, drugi,..., n-ty program w języku C. Programy: c1_1.c... c1_9.c.

Programowanie w elektronice: Podstawy C

Podział programu na moduły

Język C++ zajęcia nr 2

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Języki i techniki programowania Ćwiczenia 2

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Wskaźniki. Programowanie Proceduralne 1

Wstęp do programowania

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Język C zajęcia nr 11. Funkcje

IX. Wskaźniki.(3 godz.)

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

I - Microsoft Visual Studio C++

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

C++ wprowadzanie zmiennych

Lab 9 Podstawy Programowania

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Język C - podstawowe informacje

Funkcja (podprogram) void

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Wstęp. do języka C na procesor (kompilator RC51)

Pliki. Informacje ogólne. Obsługa plików w języku C

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Inżynieria Wytwarzania Systemów Wbudowanych

Tablice deklaracja, reprezentacja wewnętrzna

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Transkrypt:

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

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 293.15) przyrost ciepła = 293.15 * 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 2

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

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

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 */ 5

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 */ 6

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

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 8

operator spoza ortodoksyjnego C && /* adres etykiety ; operator && */ #include <stdio.h> #include <stdlib.h> 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*/ 9

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 10

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 */ 11

main() (wskaźniki) { 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 */ 12

(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 13

inny wynik programu : (wskaźniki) 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 14

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

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!! */ 16

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

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ć!) 18

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

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

#include <stdio.h> #include <stdlib.h> int main ( ) kwalifikator const { 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 */ 21

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

#include <stdio.h> #include <stdlib.h> int main ( ) kwalifikator const { 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 */ 23

kwalifikator const #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char buf[] = "lasso"; const char rak[]="rak"; /* staly lancuch znakowy */ char *wsk, *war; wsk= (char *) rak; /* rak[0]='s'; */ /* bez komentarza to blad kompilacji! */ printf("\n %s\n",wsk); war=(char *) wsk; strcpy(war,"fa"); /* string copy */ printf("\n\n %s %s %s\n",wsk, war, rak); exit(0); /* udalo sie zmienic lancuch const char! */ 24 } /* koniec funkcji main */

kwalifikator const W wyniku wykonania programu z poprzedniego slajdu: Rak fa fa fa /* czyli udało się zmienić łańcuch */ 25

#include <stdio.h> kwalifikator const #include <stdlib.h> 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 */ 26

#include <stdio.h> #include <stdlib.h> int main () kwalifikator const (stały wskaźnik) { 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 exit(0); } /* koniec funkcji main */ %s %p %p\n",wsk1,wsk2,wsk1,wsk2); 27

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

wsk1+=2; wsk2+=2; kwalifikator const (stały wskaźnik) /* 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 ) 29

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ą 30 zmienną typu int */

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

kwalifikator const #include <stdio.h> #include <stdlib.h> 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); 32 } /* koniec funkcji main */

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

kwalifikator const /* inny przykład ominiecia kwalifikatora const */ #include <stdlib.h> #include <stdio.h> 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 */ 34

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 35

#include <stdio.h> #include <stdlib.h> Długości wskaźników 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*/ 36

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) 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ń #include <stdio.h> #include <stdlib.h> #include <unistd.h> 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 */ 39

#include <stdio.h> #include <stdlib.h> argumenty wiersza poleceń 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... */ 40

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