Programsystemkonstruktion med C++

Relevanta dokument
En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

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

Det finns många flaggor till g++,

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

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

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

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Innehåll. Pekare Exempel

Tillämpad programmering

TDIU01 - Programmering i C++, grundkurs

C++-programmets beståndsdelar

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

Programsystemkonstruktion med C++

Innehåll. Pekare Exempel

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Tillämpad programmering

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

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

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Funktionens deklaration

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Repetition C-programmering

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

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

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

TDDC76 - Programmering och Datastrukturer

Introduktion C-programmering

Classes och Interfaces, Objects och References, Initialization

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

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

TDDC76 - Programmering och Datastrukturer

C++ Objektorientering - Klasser. Eric Elfving

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

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

1 Namnkontroll (NameControl)

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Innehåll. Pekare Syntax

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

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursassistent: Mårten Björkman,

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Poster ( structar ) Postdeklarationer

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Att använda pekare i. C-kod

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

F5: Högnivåprogrammering

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

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

F5: Högnivåprogrammering

Kapitel 6 - Undantag

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

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

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Synlighet. Namespace Scope-operatorn Klasser Vänner

Tommy Färnqvist, IDA, Linköpings universitet

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

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

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

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

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

TDDC76 Programmering och datastrukturer

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

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

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

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Objektorienterad Programmering (TDDC77)

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

Tentamen EDAF30 Programmering i C++

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

TDIU01 Programmering i C++

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

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

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

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

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

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Tentamen EDAF30 Programmering i C++

Tentamen i DD2387 Programsystemkonstruktion med C++

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TDDC76 - Programmering och Datastrukturer

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Kapitel 5. Strömmar. Utmatning

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

allokeras på stacken dynamiskt new delete

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

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

Objektorienterad Programmering (TDDC77)

... Funktionsanrop. Vad händer när man kör ett program?

Transkript:

Programsystemkonstruktion med C++ Övning 1 Daniel Aarno bishop@kth.se

Översikt övning 1 Kompilering och länkning Makefile Preprocessordirektiv Funktioner Funktionen main() Datatyper Minneshantering Pekare och arrayer Vanliga slarvfel Referenser Statiska variabler Kommentarer

Ett första program En klass behöver både deklaration och definition Deklaration i.h (.hh) och definition i.cpp (.cc) Private är förvalt Student::learn() Student::Student() Student::~Student() Globala funktioner och variabler är OK. main() är en global funktion Macro (inleds med #) körs av preprocessorn

Ett första program (cont'd) student.h #ifndef _STUDENT_ #define _STUDENT_ #include <iostream> #include <string> using std::string; class Student { private: string knowledge; public: Student(); ~Student() {; void learn (string info); string speak(); ; #endif student.cpp #include "student.h" Student::Student() { knowledge=""; void Student::learn(string info) { knowledge += info; string Student::speak() { return knowledge;

Ett första program (cont'd) main.cpp #include "student.h" int main() { Student s; s.learn("bla bla bla"); std::cout << s.speak() << std::endl; return 0; För att köra programmet: > g++ o ex1 main.cpp student.cpp >./ex1 bla bla bla

Kompilator och länkare

Kompilator och länkare (cont'd) Filer kan kompileras var för sig till objektfiler (.o) > g++ c file.cpp > g++ c main.cpp > ls... file.o main.o Flera objektfiler kan länkas samman till ett program (endast om main() är definerad) > g++ o ex1 main.o file.o... > g++ o ex1_debug g O1 main.o file.o debug optimeringsnivå 1

Beroenden (dependencies) Om vi ändrar main.cpp räcker det att kompilera om den Men om vi ändrar i student.cpp/h måste vi eventuellt kompilera om både student.cpp och main.cpp (main.cpp beror på student.h) Jobbigt hålla reda på beroenden Långsamt att alltid kompilera om allt Intressanta fel om allt som behöver kompileras inte kompileras om

Makefiler #variables CC = g++ FLAGS = g I~/c++kurs/student OBJ = main.o student.o #rules ex1: $(OBJ) $(CC) $(FLAGS) o ex1 $(OBJ) #don't forget tab! main.o: main.cpp student.h $(CC) $(FLAGS) c main.cpp student.o: student.h $(CC) $(FLAGS) c student.cpp clean: rm *.o ex1

Makefiler (cont'd) #variables CC = g++ FLAGS = g I~/c++kurs/student OBJ = main.o student.o SRC = main.cpp student.cpp #rules ex1: $(OBJ) $(CC) $(FLAGS) o ex1 $(OBJ) %.o: %.cpp $(CC) $(FLAGS) c $*.cpp depend: makedepend $(FLAGS) $(SRC) clean: rm *.o ex1 http://www.gnu.org/manual/make3.79.1/html_chapter/make_toc.html

Preprocessorn #include slår ihop filer innan kompilering #ifndef... #define... #endif garanterar att en fil bara inkluderas en gång // may be useful #define MAX 10000 // dangerous #define SQR1(A) A*A // less dangerous #define SQR2(A) (A)*(A)

Funktioner En funktion Behöver inte defineras där den deklareras Behöver deklareras innan den används int foo(int x); // declaration of foo int bar(int x) { return foo(x); // call to foo int foo(int x) { return x; // definition of foo Kan överlagras int foo(int x) { // code here... int foo(float x) { // code here...

En funktion Kan ha argument med förvalt värde int foo(float f, int x = 0); //< OK int foo(float f = 0, Kan vara inline Funktioner (cont'd) int x, int y = 0); //< NOT OK inline int sqr(int x) { return x*x;

Funktioner (cont'd) Fördelar med funktionen sqr() Mer läsbar kod (samma anledning som macrot SQR) Ett ställe att ändra på Alla anrop till sqr funkar likadant Löser problemet med macrot SQR Det går slött att använda funktioner. Argument måste kopieras och programmets exekvering måste styras om.

Funktioner (cont'd) inline är användbart för korta funktioner som används ofta Overhead vid funktionsanrop är störst för små funktioner Inline gör att funktionsanropet ersätts med koden det innehåller vid kompileringstilfället För mycket inlining kan ge långsammare program och större filer För mycket inlining ger långsammare kompilering

Funktioner (cont'd) Funktionen main() är speciell Kan inte heta något annat argc är antalet argument inkl. programmets namn argv är en array av C-strängar med argumenten som gavs till programmet argv[0] är programmets namn (tex /usr/bin/zip eller zip) main() är en global funktion och således inte del av någon klass main() behöver inte deklareras

Funktioner (cont'd) main.cpp #include <iostream> int main(int argc, char* argv[]) { for(int i = 0; i < argc; i++) { std::cout << argv[i] << std::endl; > g++ main.cc o main >./main hej 12./main hej 12 >

Datatyper Inbyggda datatyper bool (true/false (1 byte)) char (1 byte) int (plattformsberoende storlek) short long float (4 byte) double (8 byte) long double void (ingenting)

Datatyper (cont'd) Egna datatyper typedef char* charptr; enum Fruit { apple, banana, orange ; struct { int x; int y; double d; ; class {int x; public: void foo(); ; union {int x, bool ok, double d ; Testa sizeof(t); för olika typer T (int, double, charptr osv)

Automatiska objekt Städas automatiskt upp när scopet är slut Snabb allokering på stacken Mindre risk för slarvfel Minneshantering void foo(student s) { //< begin scope int x; for(int i = 0; i < 5; i++) { //< begin scope int y = 2*i; x = 3 + y; //< end scope (i,y) //< end scope (x,s)

Dynamiska objekt Minneshantering Heap större än stack Arrayers längd kan bestämmas i run-time Objekt kan leva utanför scope där de skapas void foo(int nmemb) { int *xptr; // Allocate array of nmemb ints xptr = new int[nmemb]; // do stuff, then // delete memory allocated by new[] delete[] xptr;

Minneshantering CODE/TEXT Själva programkoden och konstanta variabler DATA Statiska (static) initialiserade variabler BSS Statiska icke initialiserade variabler STACK Automatiskt allokerade variabler vid körning Returvärden och returadresser 4kB på Linux, kan växa till 2MB (default)

Pekare och arrayer void foo(student *studptr) { int *ptr, i; //< ptr is ptr to int, i is int int* x, y; //< x is ptr to int, y is int ptr = &i; //< ptr now holds address //< of i (e.g. 0xbfffff24) *ptr = 5; //< assign 5 to i x = ptr; //< x now also points to i; cout << *x << endl; //< would print 5 (*studptr).learn( something ); studptr >learn( more ); ptr = new int; //< ptr now holds adr //< of an int on the heap ptr = &y; //< error no way to access //< memory on heap anymore

Pekare och arrayer (cont'd) void foo(float f) { char array[4711]; //< array of 4711 uninitialized chars int ary[] = {1,2,5; //< array of 3 initialized ints // same as const char str[] = {'h','e','j',0; char str[] = hej ; char* ptr = 0; //< char pointer to nothing const float *fptr; //< The memory pointed to by f is //< read only float * const fcptr=f; //< The pointer f is read only ptr = array; //< same as ptr = &array[0]; ptr[4] = 'x'; //< set fifth element of array to x; *(ptr + 4) = 'y'; //< same thing, but to y ptr = new char[512]; //< dynamically allocated array

Vanliga slarvfel void foo(int *p) { delete p; int* bar() { int x=1; return &x; // oops! void fun() { int* p1, p2; // p2 is normal int not pointer int *p3 = new int[2]; int *p4 = new int[2]; p3 = p4; // MEMORY LEAK! foo(p3); // destruction of p3 (and p4) int x = p4[1]; // error (segfault if LUCKY)

Referenser Alias för ett objekt Som en pekare vars adress inte får ändras Måste referera till ett objekt (inte NULL) Snabbare skicka referens än objekt void iswap(int &i1, int &i2) { int tmp = i1; i1 = i2; i2 = tmp; void main() { int i = 5; int &iref = i; int *iptr = &i; iref++; // i, iref and // *iptr is now 6

static.cpp void foo() { static int i = 5; cout << i++ << endl; int main() { foo(); foo(); foo(); >./static 5 6 7 > Statiska variabler

Funktionskommentarer förklarar användning (.h) Kommentarer /** * Send a signal to the task. * * @param signal The signal to send (i.e. SIGINT) * @return true on success, false on failiure. */ bool sigsend(int signal); Procedurkommentarer förklarar implementationen (.cpp) /* getline reads one line from stdin and stores it in * the given buffer. The newline is stored. * The given buffer must be big enough to store the * trailing \0 (i.e. it must be at least one bigger * than nmax). */ void getline (char buf[], int nmax, int *nread) { //function implementation...