Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Relevanta dokument
Innehåll. Pekare Syntax

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Innehåll. Pekare Exempel

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Innehåll. Pekare Exempel

TDDC76 - Programmering och Datastrukturer

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

TDIU01 - Programmering i C++, grundkurs

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Enkla datatyper minne

Övning från förra gången: readword

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Objektorienterad Programmering (TDDC77)

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Objektorienterad Programmering (TDDC77)

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

F5: Högnivåprogrammering

F5: Högnivåprogrammering

C++ - En introduktion

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Det finns många flaggor till g++,

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

TDIU01 (725G67) - Programmering i C++, grundkurs

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Introduktionslaboration

Typkonvertering. Java versus C

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Variabler, värden och typer

Innehåll. Heltalstyper. Heltalstyper. Heltalstyper Storlekarna specificeras i <climits>

översiktskurs (5DV031)

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Introduktionslaboration

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Variabler, värden och typer

Dynamisk bindning och polymorfism

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

TDIU01 - Programmering i C++, grundkurs

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Innehåll. 1 Typer. 2 C-strängar. 3 union. 4 Bitoperationer. 5 Komma-operatorn. struct Foo; void print ( const Foo& f) } void print (int i)

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

Objektorienterad programmering Föreläsning 4

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Data, typ, selektion, iteration

TDIU01 - Programmering i C++, grundkurs

TDIU01 Programmering i C++

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

1 Funktioner och procedurell abstraktion

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad programmering

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

float Mindre rella tal ( floating point number ) double Rella tal/flyttal ( double precision floating point number )

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

TDIU01 - Programmering i C++, grundkurs

Parameteröverföring. Exempel. Exempel. Metodkropp

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

2 Pekare och dynamiska variabler.

Spelschema för årets fotbollsmästerskap! island tyskland Söndag 14/7 Växjö Arena, Växjö. Söndag 14/7 Kalmar Arena, Kalmar

TDDC76 - Programmering och Datastrukturer

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 2, vecka 8: Repetition

Innehåll. Datatyper Pekare, Arrayer och Referenser. Pekare. Pekare Syntax. Pekare Syntax, operatorerna * och & 5. Pekare och arrayer. Algoritmer.

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

grundläggande C++, funktioner m.m.

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDDC76 Programmering och datastrukturer

C++-programmets beståndsdelar

TDIU01 - Datortenta (DAT2)

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Transkript:

Programmering i C++ EDA623 Typer EDA623 (Föreläsning 4) HT 2013 1 / 33

Typer Innehåll Heltalstyper Flyttalstyper Pekare Minnesallokering Funktionspekare Typdeklarationer med typedef Typomvandlingar (casting) Uppräkningstyper Tabeller och par EDA623 (Föreläsning 4) HT 2013 2 / 33

Heltalstyper signed char (8 bitar) -127... 128 short int (8 el. 16 bitar) int (16 el. 32 bitar) long (32 bitar) unsigned char (8 bitar) 0... 255 unsigned short int (8 el.16 bitar) unsigned int (16 el. 32 bitar) unsigned long (32 bitar) EDA623 (Föreläsning 4) HT 2013 3 / 33

Heltalstyper Test med sizeof i CodeBlocks #include <iostream> using namespace std; int main () { cout << "sizeof(char)= " << sizeof(char)<<endl; cout << "sizeof(int) = " << sizeof(int) <<endl; cout << "sizeof(long)= " << sizeof(long)<<endl; cin >> ws; // Bryt med Ctrl-C... sizeof(char)= 1 sizeof(int) = 4 sizeof(long)= 4 EDA623 (Föreläsning 4) HT 2013 4 / 33

Heltalstyper Test av talområdet via casting int main () { cout << "(char) -1 = " << (int)(char) -1 << endl; cout << "(unsigned char) -1 = " << (int)(unsigned char) -1 << endl; cout << "(short int) -1 = " << (short int) -1 << endl; cout << "(unsigned short int) -1 = "<<(unsigned short int)-1<<endl; cout << "(int) -1 = " << (int) -1 << endl; cout << "(unsigned int) -1 = " << (unsigned int) -1 << endl; cout << "(long) -1 = " << (long) -1 << endl; cout << "(unsigned long) -1 = " << (unsigned long) -1 << endl; cin >> ws; (char) -1 = -1 (unsigned char) -1 = 255 (short int) -1 = -1 (unsigned short int) -1 = 65535 (int) -1 = -1 (unsigned int) -1 = 4294967295 (long) -1 = -1 (unsigned long) -1 = 4294967295 EDA623 (Föreläsning 4) HT 2013 5 / 33

Flyttalstyper float (32 bitar) double (64 bitar) long double (96 bitar) Typiskt för 32 bitars representation: 1 + 8 + 23 bitar (tecken + exponent + mantissa) +1.01 2 2 124 127 = 1.25 2 3 EDA623 (Föreläsning 4) HT 2013 6 / 33

Flyttalstyper Test med sizeof i CodeBlocks #include <iostream> using namespace std; int main () { cout << "sizeof(float)=" << sizeof(float)<<endl; cout << "sizeof(double)=" << sizeof(double) << endl; cout << "sizeof(long double)=" << sizeof(long double) << endl; cin >> ws; // Bryt med Ctrl-C... sizeof(float)=4 sizeof(double)=8 sizeof(long double)=12 EDA623 (Föreläsning 4) HT 2013 7 / 33

Pekare Indirekt adressering av liknande typ som referenser i Java. Pekare kan dock manipuleras mera fritt (med de risker det medför) Syntax Asterisk före pekarvariabelnamn ger det som pekaren pekar på (*p ger det som p pekar på) Exempel int *p; // Betyder att p är pekare till int int k=19; p = &k; // Nu har k fått ett namn till (*p) *p = 17; // Ändrar även k till 17 EDA623 (Föreläsning 4) HT 2013 8 / 33

Pekare Dereferensoperatorn * Ger det som pekaren pekar på, dvs det vars adress ligger lagrad i pekarvariabeln int *p;int k=19; p = &k; Referensoperatorn & Ger adressen till en variabel EDA623 (Föreläsning 4) HT 2013 9 / 33

Pekare Pekare till int int *p1, *p2; int n=4, m=5; p1 = &n; // p1 pekar på n p2 = &m; // p2 pekar på m *p1 = 7; // n blir 7 *p2 = *p1; // m blir också 7 p2 = p1; // p2 pekar på n EDA623 (Föreläsning 4) HT 2013 10 / 33

Pekare Pekare på konstanter och konstant pekare int k; // ändringsbar int const int c = 100;// konstant int const int *pc; // pekare till konstant int int *pi; // pekare till ändringsbar int pc = &c; // OK pc = &k; // OK, men k kan inte ändras via *pc pi = &c; // FEL! pi får ej peka på en konstant *pc = 0; // FEL! pc pekar på en konstant int *const cp = &k; // Konstant pekare cp = 0; // FEL! Pekaren ej flyttbar *cp = 123; // OK! Ändrar k till 123 EDA623 (Föreläsning 4) HT 2013 11 / 33

Pekare Sammanfattning typ *p; p = &v; // p får typen // "pekare till typ" // p tilldelas adressen till v *p = 12; // Det som p pekar på // tilldelas värdet 12 p1 = p2; // p1 pekar på samma som p2 *p1 = *p2; // Det som p1 pekar på // tilldelas samma värde // som det som p2 pekar på EDA623 (Föreläsning 4) HT 2013 12 / 33

Pekare och referenser Referenser till int int n=7, m, *p; int& r1 = n; // r1 är en referens till n r1 = 7; // n får värdet 7 int& r2 = m; // Referenser måste initieras r2 = r1; // m får värdet 7 p = &r1; // p pekar på n *p = 4; // n får värdet 4 r2 = *p + 1; // m får värdet 5 EDA623 (Föreläsning 4) HT 2013 13 / 33

Pekare och referenser Pekarversion och referensversion av swap // Pekarversionen void swap(int *pa, int *pb) { int tmp = *pa; *pa = *pb; *pb = tmp; // Referensversionen (som innan) void swap(int& a, int& b) { int tmp = a; a = b; b = tmp;... int m=3, n=4; swap(m,n); // Referensversionen används swap(&m,&n); // Pekarversionen används EDA623 (Föreläsning 4) HT 2013 14 / 33

Pekare och fält Fält kan adresseras m.h.a. pekare float f[4]; // 4 st float float *pf; // pekare till float pf = f; // samma som pf = &f[0] float x = *(pf+3); // Alt. x = pf[3]; x = pf[3]; // Alt. x = *(pf+3); EDA623 (Föreläsning 4) HT 2013 15 / 33

Pekare och fält Nollställning av fältet f // Alt. 1 for (int i=0; i<4; i++) f[i] = 0; // Alt. 2 for (float *p=f; p<f+4; p++) *p = 0; Nollställning av fältet f C++11 // Alt. 3 (C++11) for (float &e : f) e = 0; EDA623 (Föreläsning 4) HT 2013 16 / 33

Pekare och fält Funktion för nollställning av heltalsfält void zero(int *x, int n) { for (int *p=x; p < x+n; p++) *p= 0; Fungerar eftersom endast adressen värdekopieras medan innehållet ändras Indexering av heltalsfältet är oftast att föredra void zero(int x[], int n) { for (int i=0; i < n; i++) x[i]= 0; EDA623 (Föreläsning 4) HT 2013 17 / 33

Pekare och textsträngar Textsträngar i form av fält med char" char namn[] = "Nisse"; char *p; p = namn; cout << p << endl; cout << p+3 << endl; // Skriver en delsträng cout << *(p+3) << endl; // Skriver en char Nisse se s EDA623 (Föreläsning 4) HT 2013 18 / 33

Pekare och textsträngar Puzzle Corner version av strlen (ger stränglängden) // Användning av const char* för // att garanterat inte ändra något int strleng(const char *s) { const char *p; // Pekaren kan ändras! for (p = s; *p++; ) ; return p-s-1; EDA623 (Föreläsning 4) HT 2013 19 / 33

Pekare och textsträngar Exempel på fält av pekare (ett datums veckodag) char* wdays[] = {"måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag", "söndag"; int main(int argc, char* argv[]) { int y, m, d, ind; if (argc!=4) { cout <<"Anropa enligt mönstret " << argv[0] << "yyyy mm dd" << endl; return -1; y=atoi(argv[1]); m=atoi(argv[2]); d=atoi(argv[3]); if (m<3) {m+=12; y--; // Zeller s kongruens (1886)! ind = (d + 2*m + (3*(m+1))/5 + y + y/4 - y/100 + y/400) % 7; cout << argv[1] << "-" << argv[2] << "-" << argv[3] << " är en " << wdays[ind] << endl; // Datumformat enligt standarden ISO8601 EDA623 (Föreläsning 4) HT 2013 20 / 33

Minnesallokering Utrymme för dynamiska variabler skapas med new double *pd = new double; *pd = 3.141592654; float *px, *py; px = new float[20]; py = new float[20]; Frigörande av minne görs med delete delete pd; delete [] px; // [] krävs för fält delete [] py; EDA623 (Föreläsning 4) HT 2013 21 / 33

Minnesallokering Typiskt misstag: Att glömma allokera minne char namn[80]; char *p; //Ingen varning vid kompilering char str[]; // Kompileringsfel med Gnu! *namn = Z ; // Ok. Ger namn[0]= Z *p = Z ; // Fel! Z hamnar i icke // allokerat utrymme(krasch) strcpy(p, "Nisse Nilsson"); // Ger garanterat exekveringsfel // ("Segmentation fault" i Linux) EDA623 (Föreläsning 4) HT 2013 22 / 33

Minnesallokering Fler misstag: En misslyckad read_line char *read_line() { char temp[80]; cin.getline(temp, 80); return temp; // Lokalt statiskt reserverat // utrymme deallokeras vid retur!!! char namn[80]; int main () { cout << "Ange ditt namn: "; strcpy(namn, read_line()); cout << "Goddag " << namn << endl; EDA623 (Föreläsning 4) HT 2013 23 / 33

Minnesallokering Korrigerad version av read_line char *read_line() { char temp[80]; cin.getline(temp, 80); char *res = new char[strlen(temp)+1]; strcpy(res, temp); return res; // Dynamiskt allokerat överlever char namn[80]; int main () { cout << "Ange ditt namn: "; strcpy(namn, read_line()); // men minnesläcka här! cout << "Goddag " << namn << endl; EDA623 (Föreläsning 4) HT 2013 24 / 33

Funktionspekare Pekare kan också peka på funktioner float (*pf)(int,int); float hypotenusa(int a, int b) { return sqrt((float)(a*a + b*b)); float medelv(int x, int y) { return ((float)(x + y))/2; int main () { pf = hypotenusa; cout << pf(3,4) << endl; pf = medelv; cout << pf(3,4) << endl; EDA623 (Föreläsning 4) HT 2013 25 / 33

Funktionspekare Funktioner kan vara argument till funktioner float hypotenusa(int a, int b) { return sqrt((float)(a*a + b*b)); float medelv(int x, int y) { return ((float)(x + y))/2; float eval(float (*f)(int,int), int m, int n) { return f(m, n); int main () { cout << eval(hypotenusa, 3, 4) << endl; cout << eval(medelv, 3, 4) << endl; EDA623 (Föreläsning 4) HT 2013 26 / 33

Typdeklarationer med typedef Nya typer kan deklareras med typedef typedef unsigned long ulong; typedef char rad[80]; typedef double (*funpek)(int); // Följande deklarationer ulong m, n, a[12]; rad namn; funpek pf; // svarar då mot deklarationerna unsigned long m, n, a[12]; char namn[80]; double (*pf)(int); EDA623 (Föreläsning 4) HT 2013 27 / 33

Typomvandlingar (casting) Automatiska typomvandlingar Uttryck av typen x y där är en binär operator Ex: double + int ==> double float + long + char ==> float Tilldelningar och initieringar: Värdet i högerledet konverteras till samma datatyp som i vänsterledet Konvertering av typen hos aktuella parametrar till typen för de formella parametrarna Fält ==> pekare 0 ==> NULL (tom pekare, null_ptr i C++11) EDA623 (Föreläsning 4) HT 2013 28 / 33

Typomvandlingar (casting) Explicita typomvandlingar Syntax (typnamn)uttryck; // (Både i C och i C++) typnamn(uttryck); // (Endast i C++) Exempel char *p = (char *) 07650; // heltal ==> pekare long i = (long) p; // pekare ==> heltal int x=3, y=4; double a = ((double)(x+y))/2; cout << (int)(unsigned char) -3 << endl; cout << (int)(char) 1000 << endl; EDA623 (Föreläsning 4) HT 2013 29 / 33

Uppräkningstyper Möjlighet att namnge värden m.h.a. enum enum color {blue, red, green, white; enum ans {ja, nej, kanske, vetej; // Deklaration av variabler color fgcol=blue, bgcol=white; ans svar; // Tilldelningar fgcol=red; bgcol=green; svar = nej; fgcol = kanske; // Fel! svar = 2; // Fel! EDA623 (Föreläsning 4) HT 2013 30 / 33

Tabeller Flerdimensionella fält (t.ex. matriser) int m[2][3]; // En 2x3-matris m[1][2] = 7; m[0][0] = 4; m[1][0] = 5; int *p; p = m; // Fungerar inte! p = &m[0][0]; *p = 2; p[2] = 11; EDA623 (Föreläsning 4) HT 2013 31 / 33

Tabeller Parametrar av typ flerdimensionella fält void addone(int a[][3]) { for (int i=0;i<2;i++) { for (int j=0;j<3;j++) { a[i][j]++; void printmatr(int a[][3]) { for (int i=0;i<2;i++) { for (int j=0;j<3;j++) { cout << setw(8) << a[i][j] << " "; cout << endl; EDA623 (Föreläsning 4) HT 2013 32 / 33

Par Enkelt sätt att definiera par av olika datatyper #include <utility>... pair<string, int> p1("nils", 42), *pp; cout << p1.first << " " << p1.second << endl; pp = &p1; pp->second = 43; // pp-> <==> (*pp). pp->first = "Nisse"; cout << p1.first << " " << p1.second << endl; EDA623 (Föreläsning 4) HT 2013 33 / 33