Strumenti Utente

Strumenti Sito


lcs:lcs08:esercitazioni:esercitazione1

Esercitazione 1

Esercizio -1: sul debugging

Usare il debugger gdb o ddd per trovare cosa non va nei seguenti programmi

  1. ese-gdb1.c e' una soluzione completa (non funzionante) dell'esercizio percolation (vedi Esercitazione 1 dello scorso anno)
  2. ese-gdb2.c e' una soluzione parziale (non funzionante) dello stesso esercizio. In particolare si affronta soltanto l'allocazione e l'inizializzazione della matrice

Esercizio 0: Getting started -- Preprocessing, compilazione e linking

0.1) Compilare ed eseguire il seguente programma:

#include <stdio.h>
#include <math.h>
 
int main (void) {
  double x=3.0;
 
  printf("Radice = %f\n",sqrt(x));
  return 0;
}

salvato nel file ff.c con

gcc -Wall -pedantic ff.c

Chi segnala un errore? E' fallita la fase di preprocessing, la compilazione o il linking? Cosa contine il modulo oggetto se specifico l'opzione -c? Come si risolve il problema?

0.2) Cosa accade se eliminiamo la linea

#include <math.h>

? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? Viene generato l'eseguibile?

0.3) Generare il modulo oggetto. Utilizzare objdump, nm, readelf per capire cosa contengono la tabella di rilocazione, la tabella dei simboli esportati ed esterni, le sezioni data, BSS e codice.

0.4) Usare l'opzione -E e la -S del gcc: che cosa succede? Cosa accade specificando il flag -g assieme a -S? Che cosa e'

Esercizio 1. Wa-Tor

Wa-Tor e' un semplice modello di andamento della popolazione acquatica studiato in ecologia. Questo modello e' diventato popolare dopo esser stato presentato nella colonna Computer Recreations della rivista Scientific American [A. K. Dewdney, Sharks and fish wage an ecological war on the toroidal planet Wator, Scientific American, December 1984]. Wa-tor e' un pianeta ricoperto interamente da un oceano temperato. L'oceano e' abitato da predatori (gli squali) e prede (i pesci). Wator viene rappresentato da una matrice rettangolare. Ogni elemento della matrice rappresenta un'area dell'oceano che puo' essere in tre stati distinti

  • puo' essere vuota
  • puo' contenere esattamente un pesce
  • puo' contenere esattamente uno squalo.

Siccome Wator e' un pianeta rotondo le celle della prima riga (colonna) sono adiacenti alle celle dell'ultima riga (colonna).

Il tempo e' a sua volta suddiviso in unita' standard dette chronons, il sistema si evolve in passi che corrispondono ad un chronon ciascuno. Ad ogni passo la matrice che rappresenta il pianeta viene aggiornata secondo le seguenti regole:

  • Gli squali mangiano e si spostano. A ogni passo, uno squalo presente in una cella (i,j) si guarda intorno nelle celle adiacenti. Se una di queste celle contiene un pesce, lo squalo mangia il pesce e si sposta nella cella precedentemente occupata dal pesce. Se nessuna delle celle adiacenti contiene un pesce, lo squalo si sposta in una delle celle adiacenti vuote. Le celle adiacenti sono le celle in cui uno degli indici differisce esattamente di uno da i e j. Cioe' (i-1,j), (i,j-1),(i,j+1), (i+1,j). Graficamente
(i-1,j)
(i,j-1) 8-) (i,j+1)
(i+1,j)
  • Gli squali si riproducono e muoiono Se uno squalo sopravvive per almeno Sb chronon si riproduce: se e' disponibile una cella adiacente vuota questa viene occupata da un nuovo squalo. Lo squalo che si e' appena riprodotto potra' farlo di nuovo dopo altri Sb chronon. D'altra parte, se uno squalo no mangia per Sd chronon muore e scompare dalla griglia.
  • I pesci si spostano A ogni passo un pesce si sposta casualmente in una delle celle adiacenti. Siccome Wator e' un pianeta rotondo i pesci (e gli squali) possono nuotare verso l'esterno di un lato della matrice e risbucare dal lato opposto.
  • I pesci si riproducono Se un pesce sopravvive per almeno Fb chronon si riproduce: se e' disponibile una cella adiacente vuota questa viene occupata da un nuovo pesce. Il pesce che si e' appena riprodotto potra' farlo di nuovo dopo altri Fb chronon.

All' inizio della simulazione, la griglia deve essere riempita casualmente con NS squali e NF pesci. Ogni squalo (pesce) e' munito di un contatore, inizializzato a zero ed incrementato ad ogni chronon. Quando il valore del contatore raggiunge Sb (Fb) lo squalo (il pesce) si riproduce ed il contatore viene di nuovo azzerato.

Ogni volta che un pesce o uno squalo puo' scegliere di muoversi, mangiare, riprodursi, deve farlo scegliendo in maniera casuale fra le possibile alternative.

Questo modello, per quanto semplice, e' sufficiente a fornire un comportamento simile a quello che viene osservato davvero in alcune popolazioni in natura. Se c'e' abbastanza pesce, gli squali prosperano e si riproducono finche' non raggiungono un numero troppo elevato. a questo punto quasi tutto il pesce verra' divorato e iniziera' un periodo di carestia.

Si chiede di realizzare un programma C che implementi il comando wator che simula il comportamento del pianeta visualizzandone lo stato ad ogni chronon/ I parametri Sd, Sb, Fb, NF, NS ed il numero di righe e colonne della matrice devono essere specificabili da linea di comando.

Si consiglia di utilizzare una matrice separata per raccogliere gli aggiornamenti e di calcolare prima gli aggiornamenti relativi agli squali. Inoltre e' preferibile rappresentare ogni matrice come array di puntatori a righe. Per la visualizzazione e' possibile usare sleep() e usleep() per attendere fra una visualizzazione e la successiva e system(“clear”) per pulire lo schermo.

Esercizio 2. Wa-Tor analizzato

Utilizzare la funzione mtrace() e l'utility mtrace per verificare i leak di memoria nel programma sviluppato nell'esercizio 1.

Utilizzare l'utility valgrind per controllare la mancata inizializazzione di variabili, le scritture/letture in aree non allocate, i leak di memoria e altro. Ad esempio:

 $ valgrind --show-reachable=yes --leak-check=full --leak-resolution=high -v ./wator params > watout

analizzare le risposte.

lcs/lcs08/esercitazioni/esercitazione1.txt · Ultima modifica: 13/02/2008 alle 17:10 (17 anni fa) da Susanna Pelagatti