Visualizzazione dei risultati da 1 a 9 su 9

Visualizzazione discussione

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22

    [C] Acquisizione di una matrice di interi da file e passaggio con funzione

    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:
    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;
    }
    il mio problema:

    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:

    codice:
    ...
    int p;
    i=1;
    j=2;
    p = riconosciRegione(nr,nc,M,i, j, &b, &h);
    ...
    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!

    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!
    Ultima modifica di LeleFT; 31-10-2016 a 12:05

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.