54
C and C++ for TdS Tutor: Thomas Ciarfuglia Ufficio 20 DIEI Interno: 3677 [email protected]

Tutor: Thomas Ciarfuglia Dei Sistemi/Anno... · 2014-02-23 · C and C++ for TdS Tutor: Thomas Ciarfuglia Ufficio 20 DIEI ... /dev: file dei device (dispositivi) /etc: file di configurazione,

Embed Size (px)

Citation preview

C and C++ for TdS

Tutor:Thomas Ciarfuglia

Ufficio 20 DIEIInterno: 3677

[email protected]

“The Sweet Spot”

Scopi del mini-corso

● Imparare un po' di programmazione C++● Diventare un po' autonomi ● Fare conoscenza con alcuni strumenti di

Computer Vision e Robotica (OpenCV, ROS)● + Ubuntu● + Acquisire competenze professionalizzanti

Ubuntu o Windows (o altro..)

● Linux based● Open source● Molte librerie scientifiche e

tools di sviluppo

● Molto diffuso● Fancy● Molte librerie e tools, ma

spesso a pagamento

Unity Launcher e Dash

File system

All'interno della directory root (/) è presente un insieme di directory comuni a tutte le distribuzioni Linux. Quello che segue è un elenco delle directory più comuni presenti nella directory root (/):

/bin: applicazioni binarie importanti

/boot: file necessari per il boot (avvio) del computer

/dev: file dei device (dispositivi)

/etc: file di configurazione, script di avvio, etc...

/home: directory home degli utenti

/lib: librerie di sistema

/media: dispositivi rimovibili (media) montati (caricati) come CD, fotocamere digitali, ecc... .

/mnt: filesystem montati

/opt: posizione dove vanno installate le applicazioni opzionali (optional)

/usr: file e applicazioni che sono per la maggior parte disponibili a tutti gli utenti (users)

Ubuntu Software Center

Cosa ci servirà su Ubuntu

● Ubuntu o Kubuntu● I pacchetti “build-essential”● Un IDE, es NetBeans o Eclipse● Librerie: OpenCV, GSL

>> sudo apt-get install build-essential

Installare Synaptic (opzionale)

Synaptic

Cos'è il linguaggio C

● Linguaggio inventato negli anni '70 da Dennis Ritchie

● Legato a Unix sin dalle origini● Compilato● Molto comune: presente su la stragrande maggioranza delle CPU = uno

dei linguaggi più universali● Nato per sostituire l'Assembly, ma più cross-platform● Molti linguaggi hanno ereditato la sintassi dello C (es. C++, Java, PHP,

C#...) e alcuni sono influenzati da essa (es. Javascript)● low overhead: permette implementazioni efficienti, ma diminuisce la

capacità di cestire la complessità● Sistemi embedded

Cos'è il linguaggio C(++)

C++● Compilato

● È object-oriented ma permette anche functional programming e altro

● Controllo di puntatori e references e permette pass-by-value

● Gestione della memoria generalmente lasciata al programmatore

● C'è una libreria standard, STL

● ...

Java● Interpretato (JVM)

● Object-oriented

● Ammette solo pass-by-reference

● Garbage collection

● Libreria standard molto potente

● ...

La sintassi è simile, ma ci sono alcune cose a cui fare attenzione...

Source files

● Tipicamente .c o .cpp. Più raro .c++

● Contengono la definizione, cioè l'implementazione delle funzioni e classi che realizzerete

● Sono come “ricette” che la CPU esegue

Header Files

● Estensioni tipiche: .h o .hpp● Sono un modo di organizzare il

codice in maniera modulare● Di solito specificano delle

interfacce a funzioni e classi● Dichiarare vs Definire● Qualche volta contengono anche

definizioni

Compilatore

COMPILATORE

.c

.cpp

.o

.o

.c = Translation unit

tipi di base:● int, char, float, double

array:

● int my_array[10];

● double my_double_array[] = {1.0, 2.3, 4.1};

Syntax pill

● Le istruzioni sono sempre terminate da “;”

● I blocchi di codice sono identificati da “{ }”

● Le parentesi graffe si digitano: Alt Gr + Shift + “[” o “]”

Syntax pill

int add(int a, int b)

{

return a + b;

}

FUNZIONI

[out type] function_name( … parameters … )

{

//this is an inline comment

code...

/* Also this is a comment */

}

il primo file .c

int add(int a, int b){ return a + b;}

add.c

int add(int, int);

int triple(int x) { return add(x, add(x, x));}

triple.c

Compilatore

add.o

int add(int a, int b){ return a + b;}

int add(int, int);

int triple(int x) { return add(x, add(x, x));}

triple.o

add.c

triple.c

Compilatore

● GCC = Gnu Compiler Collection● g++=compilatore C++ (e C)● MingGW = Minimalist GNU for Windows

>> g++ -c add.cpp

Linker

● I file .o vanno assemblati per creare l'applicazione, o la libreria

● Il linker è il programma che fa questo

● Sempre contenuto in gcc

Syntax pill 2

int main(int argc, char *argv[])

{

//some code here

//...

return 0;

}

int main()

{

//some code here

//...

}

int main()

{

int x = 10;

int y = 2;

Return add(x,y);

}

linker

● Questa volta uniamo i file oggetto con l'opzione -o

>> g++ add.o main.o -o myapp

oppure

>> g++ add.c main.c -o myapp

Check

È il momento di fare una pausa?

tipi di base:● int, char, float, double

array:

● int my_array[10]; double my_double_array[] = {1.0, 2.3, 4.1};

stringhe:● char my_string[10];

● char* my_string;

● char* my_string = “Questa è una costante stringa”;

Variabili e costanti in C

Un po' di i/o

La funzione per dare del feedback tramite il terminale (o console) in C è printf()

int printf ( const char * format, ... );

int c = a + b;

printf(“Il risultato è: %d”, c);

Printf codes

● d o i: integer● f: decimal floating point● e: scientific notation● c: character● …

http://www.cplusplus.com/reference/cstdio/printf/

Un po' di i/o (2)

int printf ( const char * format, ... );

int a = 3; double b = 2.4e3;

printf(“Questo è un intero: %d, e questo un double: %f\n”, a, b);

librerie standard

#include <stdio.h>

int add(int,int);

int main()

{

int a = 10;

int b = 5;

int c = add(a,b);

printf("Result = %d\n", c);

return 0;

}

● stdio.h è un file header che appartiene allo standard del C (C99 o C11)

● di solito non dovete dire nulla a g++ che lo troverà da solo

Altre librerie: OpenCV

Installazione

Esempio concreto: Mat

#include <stdio.h>#include "opencv2/opencv.hpp"

int main(){ cv::Mat image; return 0;}

Questo è già C++

cv è un namespace:: è chiamato “risolutore di campo di azione”

linking esterno

>> g++

/usr/local/lib/libopencv_core.so

-I/usr/local/include/opencv2

hello.cpp

IDE

Homework 1

Obiettivo: set-up di un ambiente di sviluppo integrato →Far girare il semplice hello world con opencv

● Vi richiederà:– Installare gcc o MinGW– Installare Netbeans– Installare OpenCV– Creare un nuovo progetto C++ con i file in dotazione– Impostare directory di inclusione e librerie – Compilare e testare!

tipi di base:● int, bool, char, float, double...

tipi complessi ma utili:● string, sstream, vector

Variabili e costanti C++

Output a console C++

#include: header file

cout class

std è il namespace della

lib standard

header della libreria standard in C++ non hanno il .h

std is a namespace nad its equivalent in Java is a “package name” like, for example, java.util

Output a console in C++

std::cout è un oggetto della classe ostream che rappresenta lo standat output stream(di solito la console)

Cosa sono gli ostream?

“ostream objects are stream objects used to write and format output as sequences of characters”

Che cos'è “<<” ?

<< è un operatore (come “+”,”-”) un tipo di metodo, o funzione, che scrive testo formattato sullo stream

Input da tastiera

Syntax pill

while(condizione)

{//modify condition eventually

}

for( espressione1; espressione2; espressione3)

{...}

Esempi

bool operations_finished = false;

while(operations_finished == true)

{//modify condition eventually

operation_finished = true;}

for(int i=0; i< limit; i++){ … }

Equivale a

int i=0;

while(i<limit){ ... i++;}

Operatori di incremento e decremento unari

++,--,+=,-=,*=,/=

i+=1 equivale a i=i+1i++ e ++i sono leggermente diversi

More complex example

Stanchi di scrivere?

Logic operators:! not|| or&& and>, <, >=, <=, ==, !=

More reliable input

Tic-Tac-Toe

Proviamo a realizzare un semplice gioco

Scopo del gioco: mettere tre simboli uguali in una fila orizzontale, verticale o diagonale

Scopo dell'esercizio: Prendere dimestichezza con i costrutti sintattici di base del C e C++

Game scheleton

Player Input

//wait for inputint input = false;int count = 0;

while (count < 3) {

cin >> input;

if (cin.fail()) { cout << "bad input!" << endl; cin.sync(); cin.clear(); //clear bad input flag cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); count++; } else {

//Distinguere tra input valido e non valido /* Your code here */ }}

Board State

int board_state[3][3];

//set up initial game stateinit(board_state);...void init(int (&state)[3][3]){ // set all the board cells to the EMPTY_CELL state for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { state[i][j] = EMPTY_CELL; } }}

Game screen

Draw Screen function

void drawBoard(){ cout << " a b c" << endl; cout << " - - -" << endl; cout << "1 | | | |" << endl; cout << " - - -" << endl; cout << "2 | | | |" << endl; cout << " - - -" << endl; cout << "3 | | | |" << endl; cout << " - - -" << endl;}

Update Game State & AI

AI

Fate piazzare a caso il computer utilizzando

rand()contenuto in <cstdlib>

Homework 2

Cercare di far funzionare TicTacToe

➔ Gestire lo user input

➔ Sviluppare l'aggiornamento dello stato del gioco

➔ Stampare a schermo il risultato del ciclo di gioco

Homework 3 (opzionale)

Creare un output più carino utilizzando OpenCV