#include #include #include #define EXIT_SUCCESS 0 #define EXIT_WRONGCOMMANDLINE 1 #define EXIT_MEMORY 2 #define EXIT_OPENFILE 3 #define EXIT_WRONGINPUTFORMAT 4 #define EXIT_INCONSISTENCY 5 #include "listanodi.h" #include "listaarchi.h" #define LUNGHEZZA 80 typedef char** immagine; typedef struct _grafo { int NumNodi; int NumArchi; listanodi *LN; } grafo; void LeggeIstruzioni (int argc, char *argv[], char *ImageFile); void CaricaImmagini (char *ImageFile, int *pw, int *ph, immagine *pI); void DistruggeImmagine (immagine *pI, int h); grafo *CreaGrafo (); void DistruggeGrafo (grafo *G); void StampaGrafo (grafo* G); void CostruisceGrafoDadi (int w, int h, immagine I, grafo *G); void CompConnesse (grafo *GD, int *pNumComp, int *CompD); void StampaComponenti (grafo *G, int NumComp, int *Comp); void CostruisceGrafoPallini (grafo *GD, int *Comp, int d, grafo *GP); int main(int argc, char *argv[]) { char ImageFile[LUNGHEZZA+1]; immagine I; int w, h; grafo *GD, *GP; int d, NumDadi; int *CompD, *CompP; int NumPallini; // 1) Interpretazione della linea di comando LeggeIstruzioni(argc,argv,ImageFile); // 2) Caricamento dell'immagine CaricaImmagini(ImageFile,&w,&h,&I); // 3a) Allocazione del grafo ausiliario dei pixel appartenenti ai dadi GD = CreaGrafo(); // 4a) Costruzione del grafo ausiliario dei pixed-dadi CostruisceGrafoDadi(w,h,I,GD); // 5a) Stampa del grafo dei pixed-dadi StampaGrafo(GD); // 3b) Allocazione del vettore delle componenti connesse per i dadi CompD = (int *) calloc(GD->NumNodi+1,sizeof(int)); if (CompD == NULL) { printf("Memoria insufficiente per allocare il vettore delle componenti del grafo dei pixel-dadi!\n"); exit(EXIT_MEMORY); } // 4b) Identificazione dei dadi CompConnesse(GD,&NumDadi,CompD); // 5b) Stampa dei pixel appartenenti a ciascun dado StampaComponenti(GD,NumDadi,CompD); for (d = 1; d <= NumDadi; d++) { // 3c) Allocazione del grafo ausiliario dei pixel appartenenti ai pallini GP = CreaGrafo(); // 4c) Conteggio del numero di pallini contenuti nel dado corrente CostruisceGrafoPallini(GD,CompD,d,GP); // 3c') Allocazione del vettore delle componenti per i pallini CompP = (int *) calloc(GP->NumNodi+1,sizeof(int)); if (CompP == NULL) { printf("Memoria insufficiente per allocare il vettore delle componenti del grafo dei pixel-dadi!\n"); exit(EXIT_MEMORY); } // 4c') Identificazione dei pallini CompConnesse(GP,&NumPallini,CompP); // 5c) Stampa dei pixel appartenenti ad ogni pallino StampaComponenti(GP,NumPallini,CompP); // 5c') Stampa del numero totale di pallini printf("%d ",NumPallini); // 6c e 6c') Deallocazione del grafo ausiliario dei pixel appartenenti ai pallini // e del vettore delle componenti per i pallini DistruggeGrafo(GP); free(CompP); } printf("\n"); // 6) Deallocazione delle strutture dati DistruggeGrafo(GD); DistruggeImmagine(&I,h); free(CompD); return EXIT_SUCCESS; } void LeggeIstruzioni (int argc, char *argv[], char *ImageFile) { } void CaricaImmagini (char *ImageFile, int *pw, int *ph, immagine *pI) { } void DistruggeImmagine (immagine *pI, int h) { } grafo *CreaGrafo () { return NULL; } void DistruggeGrafo (grafo *pG) { } void StampaGrafo (grafo *G) { } void CostruisceGrafoDadi (int w, int h, immagine I, grafo *G) { } void CostruisceGrafoPallini (grafo *GD, int *Comp, int d, grafo *GP) { } void CompConnesse (grafo *G, int *pNumComp, int *Comp) { } void StampaComponenti (grafo *G, int NumComp, int *Comp) { }