Ciao, devo scrivere un programma che, ricevuta da file una matrice formata solo da numeri 1 o 0, devo individuare tutti i rettangoli formati da numeri 1 che ci sono...
Questo è tutto il codice del programma per intero:
il mio problema:codice:#include <stdio.h> #include <stdlib.h> #define FILE_IN "file_in.txt" #define MAXR 50 int leggiMatrice(int maxr, int *m[][maxr], int *r, int *c); int riconosciRegione(int nr, int nc, int *M[][nc],int r, int c, int *bp, int *hp); int main() { int b,h,i,j,nr,nc; int M[MAXR][MAXR]; if(!leggiMatrice(MAXR,M,&nr,&nc)) { printf("ERRORE: le dimensioni della matrice devono essere al piu' %d x %d.", MAXR, MAXR); exit (-1); } /* int M[5][6] = { {1,1,0,0,0,0}, {0,0,1,1,0,0}, {0,0,1,1,0,1}, {0,0,0,0,0,1}, {1,0,1,0,0,1}, }; nr=5; nc=6; */ int regione=1; for(i=0; i<nr; i++) for(j=0; j<nc; j++) if(riconosciRegione(nr,nc,M,i, j, &b, &h)==1) { printf("Regione %d: estr. sup. SX = <%d,%d> b = %d, h = %d, Area = %d\n", regione, i, j, b, h, b*h); regione++; } return 0; } int riconosciRegione(int nr, int nc, int *M[][nc], int r, int c, int *bp, int *hp) { int i,j,k,l,flag; i=r; j=c; if(M[i][j] == 1) { flag=1; for((*bp)=0,k=0; (j+k)<nc && flag==1; k++) { if(M[i][j+k] == 1) (*bp)++; else flag=0; } flag=1; for(k=0,(*hp)=0; (k+i)<nr && flag==1; k++) { for(l=0; l<(*bp) && flag==1; l++) if(M[i+k][j+l] != 1) flag=0; if(flag==1) (*hp)++; } for(i=0; i<(r+(*hp)); i++) for(j=c; j<(c+(*bp)); j++) M[i][j]=-1; return 1; } return 0; } int leggiMatrice(int maxr, int *m[][maxr], int *r, int *c) { int i,j; FILE *fr; fr=fopen(FILE_IN, "r"); fscanf(fr, "%d %d", &(*r), &(*c)); if((*r) > maxr || (*c) > maxr) return 0; for(i=0; i<(*r); i++) for(j=0; j<(*c); j++) fscanf(fr, "%d ", &m[i][j]); fclose(fr); return 1; }
Quando chiamo la funzione "leggiMatrice", questa svolge correttamente la sua funzione, cioè, dichiarata una matrice M[MAXR][MAXR] di 50x50 e passatale tramite puntatore, la riempie esattamente secondo le direttive del file di ingresso, cioè produce esattamente la matrice
{1 1 0 0 0 0......} con l'esatto numero di righe e di colonne valide previste, acquisito
{0 0 1 1 0 0......} anch'esso da file, e poiché questa funzione lavora con i puntatori, queste
{0 0 1 1 0 1......} informazioni vengono applicate direttamente alle variabili interessate,
{0 0 0 0 0 1......} cioè a "M", a "nr" e a "nc", tanto è vero che se controllo lo svolgimento del
{1 0 1 0 0 1......} programma in modalità debug, fino a qui non c'è nessuna anomalia e
.......................... tutto si svolge secondo i piani, ottenendo la matrice qui a sinistra
{......................} (di dimensioni MAXR x MAXR, ma esattamente inizializzata come voglio).
La cosa strana è che, dopo che ho ottenuto la matrice di 1 e di 0 dal file di ingresso tramite leggiMatrice, quando chiamo la funzione riconosciRegione, questa ritorna il valore 1 solamente per la posizione di indice (i=0,j=0): per tutti gli altri ritorna il valore 0!! cioè, anche se facessi la seguente assegnazione:
col debugger vedo che a p viene assegnato il valore 0, anche se l'elemento nella posizione (1,2) è uguale a 1 e la funzione riconosciRegione deve necessariamente ritornare il valore 1 per come è stata implementata!codice:... int p; i=1; j=2; p = riconosciRegione(nr,nc,M,i, j, &b, &h); ...
La cosa che mi sconvolge è che se inizializzo la matrice direttamente dal programma anziché acquisirla da un file di ingresso, la funzione riconosciRegione funziona esattamente come previsto!!!
L'unica differenza tra la matrice dichiarata dal programma e quella acquisita dal file è che quest'ultima ha dimensioni 50 x 50, per tutto il resto è uguale alla prima.
Se dichiaro direttamente la matrice dal main, l'output che ottengo è:
Regione 1: estr. sup. SX = <0,0> b = 2, h = 1, Area = 2
Regione 2: estr. sup. SX = <1,2> b = 2, h = 2, Area = 4
Regione 3: estr. sup. SX = <2,5> b = 1, h = 3, Area = 3
Regione 4: estr. sup. SX = <4,0> b = 1, h = 1, Area = 1
Regione 5: estr. sup. SX = <4,2> b = 1, h = 1, Area = 1
mentre se l'acquisisco tramite la funzione leggiMatrice, ottengo solo:
Regione 1: estr. sup. SX = <0,0> b = 2, h = 1, Area = 2.
Dopo aver acquisito la matrice con la funzione ho anche provato a ristamparla a video per i range di valori interessati, ovvero per 0 < i < nr e 0 < j < nc ed è esattamente come la voglio io, l'unico problema è che "non piace" alla funzione riconosciRegione.... ripeto, se invece la dichiaro semplicemente dal main come M[5][6] non ho nessun problema.
Spero di essere stato abbastanza chiaro e che mi potiate aiutare, devo consegnare questo progetto entro le 23:59 del 31/10, qualsiasi suggerimento è ben apprezzato!