#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) { if (argc != 2) { printf("Command line format wrong!\n"); exit(EXIT_WRONGCOMMANDLINE); } strcpy(ImageFile,argv[1]); } void CaricaImmagini (char *ImageFile, int *pw, int *ph, immagine *pI) { FILE *fImageFile; int i; fImageFile = fopen(ImageFile,"r"); if (fImageFile == NULL) { printf("File %s does not exist!\n",ImageFile); exit(EXIT_OPENFILE); } if (fscanf(fImageFile,"%d %d\n",pw,ph) != 2) { printf("Nella prima riga mancano le dimensioni dell'immagine!\n"); exit(EXIT_WRONGINPUTFORMAT); } *pI = (immagine) calloc(*ph,sizeof(char *)); if (*pI == NULL) { printf("Memoria insufficiente per allocare l'immagine!\n"); exit(EXIT_MEMORY); } for (i = 0; i < *ph; i++) { (*pI)[i] = (char *) calloc(*pw+2,sizeof(char)); if ((*pI)[i] == NULL) { printf("Memoria insufficiente per allocare la riga %d dell'immagine!\n",i+1); exit(EXIT_MEMORY); } fgets((*pI)[i],*pw+2,fImageFile); } fclose(fImageFile); } void DistruggeImmagine (immagine *pI, int h) { int i; for (i = 0; i < h; i++) free((*pI)[i]); free(*pI); *pI = NULL; } 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) { }