Det finns många flaggor till g++,



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

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

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

Programsystemkonstruktion med C++

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

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

C++-programmets beståndsdelar

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

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

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

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

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

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

Programsystemkonstruktion med C++

TDIU01 - Programmering i C++, grundkurs

Att använda pekare i. C-kod

TDP005: Introduktion till Make

Kapitel 6 - Undantag

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

Introduktion C-programmering

TDIU01 - Programmering i C++, grundkurs

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

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

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

Repetition C-programmering

TDDC76 - Programmering och Datastrukturer

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

Tillämpad programmering

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

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

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Innehåll. Pekare Exempel

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

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

OOP Objekt-orienterad programmering

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

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

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

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

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

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

Tentamen EDAF30 Programmering i C++

Innehåll. Pekare Exempel

allokeras på stacken dynamiskt new delete

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Tommy Färnqvist, IDA, Linköpings universitet

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

1 Klasser och objektorientering Vad är objektorientering?

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

TDDC76 - Programmering och Datastrukturer

TDP005 Projekt: Objektorienterat system

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

Poster ( structar ) Postdeklarationer

TDP005. Föreläsning 2. Filip Strömbäck

Tentamen i DD2387 Programsystemkonstruktion med C++

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

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

TDIU01 - Programmering i C++, grundkurs

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Dynamisk bindning och polymorfism

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

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

Programmering B med Visual C

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

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

Classes och Interfaces, Objects och References, Initialization

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

TDDC76 Programmering och datastrukturer

Övningar Dag 2 En första klass

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

Tillämpad programmering

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

Programmering i C++ Kompilering från kommandoraden

Kapitel 5. Strömmar. Utmatning

TDIU01 Programmering i C++

TDDC76 - Programmering och Datastrukturer

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

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

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

En kort text om programmering i C.

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

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

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

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

F4. programmeringsteknik och Matlab

C++ Objektorientering - Klasser. Eric Elfving

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

Laboration 10 - Eclipse

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

1 Namnkontroll (NameControl)

Programmeringsteknik med C och Matlab

Transkript:

C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se Inge Frick, inge@nada.kth.se Alexander Baltsatsis hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m. ett exempel 1 C++ Övning1 Ett enkelt program i C++, hello.cpp #include <iostream> int main() { std::cout << "Hello World\n"; return 0; Då program körs anropas main (endast en main per program får länkas in). > g++ -o hello hello.cpp > hello Hello World > -o anger vad man vill att det körbara programmet ska heta. Annars blir namnet a.out 2 C++ Övning1 Det finns många flaggor till g++, här är några: -g debug-information, bra när man letar efter fel -Wall g++ varnar för saker som är misstänkta -ansi kräver att man följer standarden -pedantic klagar mycket (bra!) -c ingen länkning -O optimera (programmet blir snabbare) -v kolla vilken version av kompilatorn man kör nu 3 C++ Övning1 Större program delas lämpligen upp i flera filer. Normalt lägger man deklarationer i header-filer (oftast ''.h'') och definitioner i källkodsfiler (oftast ''.cpp''). > g++ -c studenter.cpp > g++ -c klasser.cpp > g++ -c main.cpp > ls klasser.cpp klasser.o main.cpp main.o studenter.cpp studenter.o > g++ -o mitt_program klasser.o studenter.o main.o > mitt_program Man kan också göra > g++ -o mitt_program klasser.cpp studenter.cpp main.cpp > mitt_program Det första alternativet är bättre. När man ändrar i en fil behöver man bara kompilera om den och sen länka om. Sparar tid. 4 C++ Övning1

Makefile håller reda på vilka filer som behöver kompileras om. Mycket användbart. Filen Makefile FLAGS= -g -Wall -ansi -pedantic # OBS!! alla indrag måste vara en TAB mitt_program: main.o studenter.o klasser.o g++ -o mitt_program main.o studenter.o klasser.o main.o: main.cpp studenter.h klasser.h g++ $(FLAGS) -c main.cpp studenter.o: studenter.cpp studenter.h klasser.h g++ $(FLAGS) -c studenter.cpp klasser.o: klasser.cpp klasser.h g++ $(FLAGS) -c klasser.cpp kör ''make'', vilket kör första regeln (mitt_program) 5 C++ Övning1 När man har många filer är det jobbigt att lista alla beroenden m.m. för hand. Det kan make göra åt oss. FLAGS= -g -Wall -ansi -pedantic FILES= main.o studenter.o klasser.o mitt_program: $(FILES) g++ $(FLAGS) -o $@ $^ %.o:%.cpp g++ $(FLAGS) -c $< depend: makedepend -- $(FLAGS) -- $(wildcard *.cpp) Kör ''make depend'' (första gången) och sen ''make'' 6 C++ Övning1 Preprocessorn kan lite av varje: När man kompilerar händer följande: preprocessorn körs kompilering (eventuellt) länkning 7 C++ Övning1 #include <iostream> #include "studenter.h" // klistra in innehållet här #define MAX 10000 // använd const int MAX = 10000; istället #define SQR(X) (X)*(X) // använd inline och template istället #ifndef STUDENTER_H #define STUDENTER_H... // detta kommer klistras in högst 1 gång #if 0... // en sorts kommentarer,... // där man kan ha kommentarer i kommentarer 8 C++ Övning1

Funktioner int foo(int x); // deklaration int bar(int x) { return foo(x); // definition int foo(int x) { return x+1; int foobar(int x = 0) {foo(x); return bar(x); foobar(2); // ok foobar(); // ok, x blir 0 double foo(double x) {... // överlagring av foo inline int snabb(int x) {... // inline betyder ungefär klistra in kroppen // istället för att anropa 9 C++ Övning1 enum, en sorts heltalstyp enum color {white, red, blue; // white = 0, red = 1, blue = 2 void foo(color c) { switch(c) { case white: bar(); break; case red: bar2(); break; case blue: bar2(); break; foo(white); // ok foo(2); // inte ok typedef ger nya namn till datatyper typedef char * CharPointer; CharPointer p = "hej"; 10 C++ Övning1 Pekare En pekare är en adress i minnet. int *ptr = 0; ptr = new int; // allokera en int att peka på // ptr innehåller adressen till en int // vi allokerat int *ptr2 = 0; int x = 3; ptr2 = &x; // peka på x // ptr2 innehåller adressen till x:s plats // i minnet En array använder pekare implicit int foo[4]; // 4 integer int bar[] = {1, 27, 2; // tre integer, med dessa // värden int *ptr = new int[12]; // en array av 12 // integer, allokerad i dynamiskt minne bar[1]; // 27, första position har index 0 bar[i] är samma sak som *(bar + i) så i[bar] kan man också skriva... *ptr2 = 4; // nu är x == 4, * betyder // följ pekaren 11 C++ Övning1 12 C++ Övning1

Automatiskt och dynamiskt minne Dynamiskt minne: Större än stacken, nödvändigt för stora objekt Storlek (t.ex. på array) kan bestämmas vid runtime Objekt kan leva utanför det scope de skapades i Måste frigöras när man är klar med det Heap Dynamiskt minne Stack Automatiskt minne Automatiskt minne (stacken): Städas upp automatiskt, när scope tar slut Snabb allokering Mindre risk för slarvfel, används så ofta det går 13 C++ Övning1 Maskinkod 14 C++ Övning1 int *p = new int[100];... delete p; // BUG! borde vara delete [] p int *p = new int[100]; int *p2 = new int[200]; p = p2; // minnesläcka, vi kan inte längre // frigöra våra 100 integer delete [] p; int x = p2[10]; // bug! vi har redan gjort // delete på minnet int *foo() { int x;... return &x; // x lokal!!!! En klassisk bug! int * p, p2; // p är int*, p2 är int int *p, *p2; // båda är int* 15 C++ Övning1 Kommentarer Kommentera er kod. Kommentarer är till dels för andra dels för ens egen skull. Pröva att läsa några andra studenters kod om ni tycker det verkar onödigt. All er kod i kursen förväntas vara kommenterad. Kommentarer i header-filer bör förklara formen på indata och utdata eller vad en klass är tänkt att göra. Kommentarer i källkodsfiler bör förklara implementationsdetaljer som ej framgår av programkoden. 16 C++ Övning1

Ett exempel >./exempel Anna says: C++ is related to C. DDD is a C++-debugger. Per says: g++ is a useful compiler. DDD is a C++-debugger. #include "student.h" #include "lecture.h" int main() { Student s1("anna"); Student s2("per"); s1.learn("c++ is related to C."); s2.learn("g++ is a useful compiler."); exempel.cpp Lecture l(10); l.addstudent(s1); l.addstudent(s2); l.teach("ddd is a C++-debugger."); l.query(0); l.query(1); return 0; 17 C++ Övning1 18 C++ Övning1 #ifndef STUDENT_H #define STUDENT_H #include <string> student.h class Student { // deklarera klassen Student public: Student(std::string Name = ""); ~Student(); void learn(std::string); void speak(); private: std::string name; std::string knowledge; ; 19 C++ Övning1 lecture.h #ifndef LECTURE_H #define LECTURE_H #include <iostream> #include <string> #include "student.h" class Lecture { // deklarera klassen Lecture public: Lecture(int); ~Lecture(); void query(int); void addstudent(student &); void teach(std::string); private: int capacity; int size; Student *members; ; 20 C++ Övning1

#include <iostream> #include <string> #include "student.h" student.cpp Student::Student(std::string Name) : name(name), knowledge("") { Student::~Student() { void Student::learn(std::string info) { knowledge += info; void Student::speak() { std::cout << name << " says: " << knowledge << std::endl; lecture.cpp #include "lecture.h" Lecture::Lecture(int cap) : capacity(cap), size(0) { members = new Student[cap]; Lecture::~Lecture() { delete [] members; void Lecture::addStudent(Student &s) { if(0 <= size && size < capacity) { members[size++] = s; // OBS! kopia av s void Lecture::query(int i) { if(i >= 0 && i < size) { members[i].speak(); void Lecture::teach(std::string info) { for(int i = 0; i < size; i++) { members[i].learn("\n\t"+info); // eftersom vi har new i konstruktorn borde vi // egentligen skriva operator=() och // copy-konstruktor också, i verkligheten 21 C++ Övning1 22 C++ Övning1