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

Relevanta dokument
Programsystemkonstruktion med C++

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

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

Det finns många flaggor till g++,

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

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

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

Innehåll. Pekare Exempel

C++-programmets beståndsdelar

Innehåll. Pekare Exempel

Programsystemkonstruktion med C++

Tillämpad programmering

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

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

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

TDIU01 - Programmering i C++, grundkurs

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

Tillämpad programmering

TDDC76 - Programmering och Datastrukturer

Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 Programmering i C++

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

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

TDDC76 - Programmering och Datastrukturer

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

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

OOP Objekt-orienterad programmering

Objektorienterad Programmering (TDDC77)

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

Dynamisk bindning och polymorfism

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

(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 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

allokeras på stacken dynamiskt new delete

TDDC76 Programmering och datastrukturer

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

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

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

Att använda pekare i. C-kod

Objektorienterad Programmering (TDDC77)

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

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

1 Klasser och objektorientering Vad är objektorientering?

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

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

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

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

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

Innehåll. Pekare Syntax

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

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

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

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

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

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

TDDC76 - Programmering och Datastrukturer

JAVA Mer om klasser och objektorientering

Övningar Dag 2 En första klass

TDDC77 Objektorienterad Programmering

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

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

Programmering för språkteknologer II, HT2011. Rum

Föreläsning 6: Metoder och fält (arrays)

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

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

Programmering B med Visual C

C++ Objektorientering - Klasser. Eric Elfving

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

Objektorienterad programmering i Java

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

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

Föreläsning 5-6 Innehåll

TDIU01 - Programmering i C++, grundkurs

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

Kapitel 6 - Undantag

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Transkript:

Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, 2003 09 11 Ronnie Johansson, rjo@nada.kth.se Vi kommer att titta på: Kompilering och länkning make och Makefile Preprocessordirektiv main() funktionen Funktioner Datatyper Automatiska och dynamiska objekt Pekare och arrayer Pekararitmetik och vanliga slarvfel Referenser Kommentarer Kurskatalog: /info/cprog03/ (student.h) #ifndef _STUDENT_ #define _STUDENT_ #include <iostream> #include <string> class Student private: string knowledge_; public: Student(); ~Student(); void learn(string info); string speak(); ; #endif (student.cpp) #include student.h Student::Student() knowledge_=""; //medlemsvariabler initieras här void Student::learn(string info) knowledge_+=info; string Student::speak() return knowledge_; (main.cpp) #include student.h int main() Student s; s.learn("bla bla bla"); cout << s.speak() << endl; return 0; Första exemplet Först deklarerar vi klassen sedan definierar vi dess funktioner. o Private är default. o Student:: anger scope. o ~Student() är destruktor. Global main funktion. o Globala funktioner och variabler är tillåtna. Deklarationer i.h definitioner i.cpp. Macro (#...) körs av preprocessorn. >g++ o ex1 main.cpp student.cpp >ex1 >bla bla bla Kompilator & länkare Filer kan kompileras var för sig till objektsfiler (.o filer): >g++ c student.cpp >g++ c main.cpp >ls... main.o student.o och länkas (kräver main() funktion): >g++ o ex1 main.o student.o >g++ g o ex1 main.o student.o (för att använda med debuggern) Projekt Om vi ändrar main.cpp räcker det att kompilera den. Men om vi ändrar i student.cpp/h måste vi eventuellt kompilera båda (main.cpp beroende av student.h).

Makefile # variabler CC = g++ FLAGS = g I~/cppkurs/student OBJ = main.o student.o # regler ex1: $(OBJ) $(CC) $(FLAGS) o ex1 $(OBJ) #glöm inte TAB! main.o: main.cpp student.h $(CC) $(FLAGS) c main.cpp student.o: student.cpp student.h $(CC) $(FLAGS) c student.cpp clean: rm.o ex1...makefile CC = g++ FLAGS = g I~/cppkurs/student OBJ = main.o student.o SRC = main.cpp student.cpp 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/make 3.79.1/html_chapter/make_toc.html) Preprocessordirektiv #include slår ihop filer innan kompilering. #ifndef... #define... #endif garanterar att en fil bara inkluderas en gång. #define MAX 10000 //kan vara praktiskt #define SQR(A) AA //farligt!! SQR(x+1) > x+1x+1=2x+1 #define SQR(A) (A)(A) mainsyntax Java public class Main public static void main(string args[]) int no_of_args = args.length; for (int i = 0; i < no_of_args; i++) System.out.println(args[i]); > java Main abc 123 abc 123 C++ int main(int argn, char argc[]) for(int i=0; i<argn; i++) cout<<argc[i]<<endl; return 0; > a.out abc 123 a.out abc 123 Skillnader mellan C++ och Java första argumentet, argc[0], är programmet självt args.length finns ej, argn har längden. main() funktionen ligger ej i en klass

Funktioner En funktion......behöver inte definieras där den deklareras. Men den behöver deklareras innan den används: int foo(int x); int bar(int x) return foo(x); int foo(int x) return x;...kan överlagras: int foo(int x)... int foo(float x)......kan ha argument med default värde: foo(int x=0); // ok foo(int x = 0, float y, char c = a ); // ej ok...kan vara inline: inline foo(int x)... int min( int v1, int v2 ) return ( v1 < v2? v1 : v2); Fördelar med en funktion min() istället för att skriva den korta koden direkt: Ger mer läsbar kod Ett ställe att ändra på Alla anrop till min fungerar likadant Tyvärr går det slött att använda funktionen: argumenten måste kopieras och sparas undan, och programkörningen måste hoppa till den plats där funktionen finns i minnet. Nyckelordet inline gör att funktionsanropet kan ersättas vid kompileringstillfället med koden som den innehåller. inline int min( int v1, int v2 ) Mest användbart med korta kodsnuttar som används mycket ofta. Datatyper bool char int short long float double long double void System GUI samt tråd och processhantering finns ej i språket. Man får använda OS specifika APIn. Garbage collect finns inte. Man måste själv se till att minne inte läcker. enum Sexunknown, male, female typedef char p_char Testa sizeof(t)!

Automatiska eller dynamiska objekt Automatiskt allokerade objekt Ex.vis: void foo(student s) int i; Städas automatiskt upp när scopet är slut (t ex när funktion returnerar). Snabb allokering på stacken Mindre risk för slarvfel (minneshanteringen sker ju automatiskt) Dynamiskt allokerade objekt: Ex.vis int arr = new int[n]; // allockerar minne för N stycken int Free store större än stacken. Arrayers längd kan bestämmas i runtime Objektet kan leva utanför scope där det skapas. Länkad lista (implementeras ofta med pekare) Pekare & array [] En pekare är en address i minnet. o int ptr; // plats för en adress o int ptr = new int; //allokerar en int i minnet. o ptr är adressen. o ptr är värdet som ptr pekar på o Student ptr = &stud; (ptr).learn( weird eh? ); ptr >learn( weird eh? ); En array använder pekare. o argc är &argc[0]. o argc[i] är (argc+i). // pekararitmetik o int arr[4]; // 4 oinitierade int. o int arr[] = 1,2,3,4; //initierad array. o int arr = new int[n]; //dynamisk array. o char str = "hej"; // h, e, j, \0 Vanliga slarvfel med pekare void foo(int p) delete p; int p1 = new int[2]; int p2 = new int[2]; p2 = p1; //minnesläcka foo(p2); //p1 och p2 förstörda int x = p1[0]; //oops! int bar() int x=1; return &x; //oops! int p1, p2; //p2 är vanlig int Referenser & Som i Java! Alias för ett objekt. Som en pekare vars adress inte får ändras och objektet måste existera. int i = 1; int &j = i; // j har typen int, inte int j++; // i ökas till 2 int k = &i; // i,j,k har samma värde void swap( int &v1, int &v2 ) int tmp = v2; v2 = v1; v1 = tmp; Statiska variabler foo() static int N = 0; N++;...

(lecture.h) #ifndef _LECTURE_ #define _ LECTURE _ #include <iostream> #include <string> #include "student.h" class Lecture private: int capacity_, size_; Student members_; //pointer to array of Students public: Lecture(int cap); ~Lecture(); string query(int i); void addstudent(student s); void teach(string info); ; #endif (lecture.cpp) #include "lecture.h" Lecture::Lecture(int cap) capacity_= cap; members_ = new Student[cap]; //dynamic allocation size_= 0; Lecture::~Lecture() delete [] members_; //clean up memory void Lecture::addStudent(Student s) //copies Student if(size_<capacity_) members_[size_++] = s; string Lecture::query(int i) if(i<capacity_) //check range return members_[n].speak(); return ""; void Lecture::teach(string info) for(int i=0; i<size_; i++) members_[i].learn("\n\t"+info); Kommentering Funktionskommentar förklarar vad funktionen returnerar. / list_empty list_empty returns true if the list is empty and false otherwise. Def: list_empty (l) == (list_size (l) == 0) / bool list_empty (List l); Procedurkommentar förklarar vad proceduren gör och vad den påverkar (variabler, filer...). / getline 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[], / IN: where to store line / int nmax, / IN: max #chars to read / int nread); / OUT: #chars read, 0 means EOF /