Laboratorio di trattamento numerico dei dati sperimentali

Documenti analoghi
GDB. The GNU Debugger

dall argomento argomento della malloc()

Introduzione a GCC: GNU Compiler Collection

Gestione delle eccezioni in Java

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Programmazione Orientata agli Oggetti in Linguaggio Java

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

3. Terza esercitazione autoguidata: progetto gestione voli

Oggetti Lezione 3. aspetti generali e definizione di classi I

Java Native Interface Appunti

La prima applicazione Java con NetBeans IDE. Dott. Ing. M. Banci, PhD

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Allocazione dinamica della memoria - riepilogo

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

I puntatori e l allocazione dinamica di memoria

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

UD4 - MATLAB. M-file. Efficienza degli algoritmi. Formati d uscita

Lezione 9: Strutture e allocazione dinamica della memoria

Importazione dati. e/fiscali Spesometro - Rel con gestionale e/satto. Gestionale e/satto

Gestione dei File in C

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Input/output in C e in C++

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Elementi del calcolatore: CPU

Pila.h versione 6. class Pila { private: int marker; int * contenuto; public:

Classe 3a INF - Esecuzione di un interrupt: ricostruzione delle operazioni al calcolatore con Turbo Debugger

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Ingegneria del Software

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Inizializzazione, Assegnamento e Distruzione di Classi

Le command line di Java

Visibilità dei Membri di una Classe

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

ACCESSO ALLA POSTA ELETTRONICA TRAMITE OUTLOOK WEB ACCESS

Prova Finale a.a. 2011/2012. Laboratorio 1: Introduzione a Java e Eclipse

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

La struttura dati ad albero binario

Cosa è importante: pom.xml Goal Plug-in Repository

Algoritmi di Ricerca. Esempi di programmi Java

ZZZ01 Esercizi Vari. Esercizi per preparazione alla prova pratica di laboratorio

Corso di Laurea in Matematica. Seminario C/C++ Lorenzo Dusty Costa. Università degli Studi di Milano Dipartimento di Matematica

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Laboratorio di Programmazione Lezione 1. Cristian Del Fabbro

Le variabili. Olga Scotti

Selezione per messaggio Sedex e Movpop

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive

Connessione ad internet

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 02 Tipi semplici in C

PG5 Starter Training Applicazione File System Daniel Ernst EN Stefano Peracchi IT

Un esempio di ereditarietà in JAVA

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

Elettronica dei Sistemi Programmabili A.A Microcontrollori. Introduzione allo sviluppo di progetti

costruttori e distruttori

Sistemi Web per il turismo - lezione 3 -

NOTE RILASCIO IATROS SISS v. 2.X

Via Oberdan, 42, Faenza (RA) Italy Tel.: Fax: WAVE MODE MOBILE GUIDA RAPIDA

Nastro trasportatore con ribaltamento cassetta.

Utilizzare il debugger di Visual Studio

Utilizzo e scrittura di classi

Ambienti di sviluppo integrato

Usare Python in Linux

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Il sistema operativo: interazione con l utente

Il Manuale di KXSLDbg. Keith Isdale Traduzione del documento: Samuele Kaplun Traduzione del documento: Simone Solinas

Esercizi di programmazione in C

Laboratorio di Algoritmi e Strutture Dati

Definizione unitaria delle coniche

Introduzione ad Eclipse

Gestione di files Motivazioni

Manuale d uso DropSheep 4 imaio Gestione Pixmania-PRO Ver 1.1

Ricerca sequenziale di un elemento in un vettore

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Puntatori Passaggio di parametri per indirizzo

Esercizi di Algoritmi e Strutture Dati

Il comando provoca il salvataggio dello stato e la terminazione dell esecuzione.

Il programma OCTAVE per l insegnamento dell algebra lineare nella Scuola Secondaria p. 1

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Creazione manuale delle tabelle (mediante scrittura del codice SQL corrispondente)

Laboratorio di Informatica Lezione 2

AE RZT QSO RKPT SQZC

Esame di Informatica Generale 25 giugno 2010 Professori: Carulli, Fiorino, Mazzei

Manuale di KWatchGnuPG. Marc Mutz Sviluppatore: Steffen Hansen Sviluppatore: David Faure Traduzione della documentazione: Luciano Montanaro

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

RILASCIO NOTE DI RILASCIO NOTE DI RILASCIO NOTE DI RILASCIO. Bilancio. Bilancio Ver Bilancio. Bilancio. Bilancio. Bilancio.

3. La sintassi di Java

Laboratorio di programmazione

Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment

Fondamenti di Informatica. Dichiarazione, creazione e gestione di array in Java

Transcript:

Laboratorio di trattamento numerico dei dati sperimentali Maurizio Tomasi turno A2 Giovedì 16 Novembre 2017

Avviso Il prof. Carminati vorrebbe comunque fare lezione nella giornata di Venerdì 17 Novembre domani, visto che non sono previsti compitini per gli studenti del II anno. Al momento l'aula prenotata è l'aula A. Consultate il sito questa sera, perché potrebbero esserci cambiamenti dell'ultimo minuto.

Esercizio 6.0 Il punto 4 dell'esercizio «questi metodi devono controllare che l'indice delle componenti richieste sia compatibile con la lunghezza del vettore» richiede di gestire una condizione d'errore particolare, ma non dice in che modo gestirla. Un errore del genere è solitamente imputabile a un bug nel codice, non ad un uso scorretto del programma da parte dell'utente. Non è quindi detto che abbia senso scrivere un messaggio d'errore: questi messaggi dovrebbero aiutare l'utente a capire come usare il programma, ma se c'è un bug, il povero utente può fare ben poco!

Esercizio 6.0 In questi casi la soluzione migliore è quella di far fallire il programma nel modo più clamoroso e catastrofico possibile: in questo modo l'utente capirà che deve contattare lo sviluppatore. Ci sono una serie di possibilità: 1. Usare la funzione abort definita in stdlib.h ; 2. Sollevare un'eccezione. La soluzione migliore sarebbe la 2, ma le eccezioni sono un argomento complesso e non sono trattate in questo corso, quindi il consiglio è di usare abort. Da linea di comando scrivete man abort per avere maggiori dettagli.

Esercizio 6.0 L'esercizio richiede di costruire una classe Vettore, che funziona in modo molto simile alla classe std::vector usabile con #include<vector>. Nei programmi della vita reale, si usa sempre std::vector : lo scopo dell'esercizio è quello di farvi capire quali sono i problemi da affrontare nella costruzione di una classe come questa.

La classe std::vector Il linguaggio C++11 ha introdotto alcune importanti novità che funzionano con la classe std::vector ma non con la classe Vettore che scriverete oggi. Elenchiamo qui alcune delle caratteristiche di std::vector accessibili dal C++11.

Inizializzazione La classe std::vector può essere inizializzata con una sola riga: std::vector<double> values { 1.0, 2.0, 3.0, 4.0 };

Loop sugli elementi Il C++11 introduce una sintassi molto comoda per iterare sugli elementi di un vettore: std::vector<double> values { 1.0, 2.0, 3.0, 4.0 }; for (double x : values) { std::cout << x << "\n"; }

Ciclo di vita delle variabili Quando il ciclo di vita di una variabile finisce in gergo, termina la visibilità della variabile, il C++ si preoccupa di liberare la memoria associata. Di norma non è necessario preoccuparsi dei dettagli, perché quello che fa il C++ è sufficiente. if (verbose) { double ver = get_version_number(); std::cout << "version " << ver << "\n"; } // at this point, "ver" does no longer exist Terminato il codice nell' if, la variabile ver non è più usata e la memoria allocata per essa può essere liberata. Il C++ fa questo in modo automatico.

Distruttori Nel caso in cui si crei una variabile di un tipo complesso es., una classe, può essere però che il C++ non sappia bene quali risorse liberare. Consideriamo le seguenti classi: class PointerTo { int * m_a; // this takes 8 bytes public: PointerTo(int * ptr_a) : m_a(ptr_a) {} }; class NewVar { int * m_a; // this takes 8 bytes public: // but here we are allocating 8 more bytes NewVar(int a) : m_a(new int) { *m_a = a; } };

Distruttori Consideriamo adesso questa funzione: void fn(void) { int a = 123; PointerTo p(&a); NewVar n(a); } /* What should happen here to the data pointed by p.m_a and n.m_a? */ Cosa farà il C++ quando la funzione termina? 1. Dovrà liberare la memoria allocata per la variabile p, incluso quindi il puntatore m_a ma non la variabile puntata da m_a ; 2. Dovrà liberare la memoria allocata per la variabile a, incluso il puntatore m_a : ma in questo caso dovrebbe anche chiamare delete m_a, però non lo fa!

Distruttori Il C++ non sa però che il puntatore PointerTo::m_a punta a una zona di memoria che verrà già liberata è la variabile a = 123, mentre NewVar::m_a è un'area di memoria che deve essere liberata. Di default, il C++ libera m_a in entrambi i casi, ma si disinteressa della variabile a cui punta m_a : per PointerTo non ci sono problemi, ma per NewVar sì! In questi casi è utile definire un distruttore, che liberi esplicitamente la memoria che il C++ non reclamerebbe autonomamente: NewVar::~NewVar() { delete m_a; }

Debug del codice Il codice che usa puntatori ed allocazioni di memoria è molto fragile e facilmente soggetto a crash e malfunzionamenti. Un utile strumento per capire cosa abbia scatenato un crash è lo Gnu Debugger GDB. Per usarlo, modificate il vostro Makefile in modo che abbia la riga CXXFLAGS = g oppure aggiungete il flag g quando eseguite g++ : g++ g c o main.o main.cpp

Debug del codice Una volta compilato il programma con g, invece che eseguirlo direttamente, avviate gdb. Se il vostro programma si chiama esercizio6.0, avviate gdb così: gdb esercizio6.0 A questo punto comparirà il prompt di GDB: (gdb) dal quale si possono digitare comandi. Se il vostro programma richiede argomenti da linea di comando, usate set args : set args argomento1 30 25.0

Debug del codice A questo punto potete eseguire il codice col comando run. Se il codice dovesse andare in crash, comparirà nuovamente il prompt (gdb). Nel caso in cui dovesse accadere ciò, avete a disposizione un'ampia gamma di comandi con cui ispezionare lo stato del codice: 1. backtrace stampa a video un'istantanea delle funzioni in esecuzione al momento del crash; 2. print VAR stampa a video il valore della variabile VAR ; 3. frame NN si sposta alla funzione numero NN, dove il numero è quello mostrato da backtrace. GDB può essere istruito anche perché si fermi ogni volta che si raggiunge una determinata funzione, senza necessariamente un crash. Consultate la documentazione info gdb per dettagli.

Esercizio 6.1 Il consiglio è di fare in modo che il programma salvi autonomamente un file di testo che contenga due colonne: la prima col numero di elementi considerati, la seconda con il tempo impiegato. Per cronometrare il tempo di esecuzione, usate la funzione clock, definita in time.h da terminale digitate info clock per sapere come usarla, attenti all'unità di misura del numero restituito!