Visualizzazione dei risultati da 1 a 9 su 9

Hybrid View

  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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per il tag CODE non devi scrivere \code ma con la barra /

    Per il resto, non capisco perché l'argomento delle funzioni che prevedi è una "matrice di puntatori" ...

    Devi scrivere

    int M[][MAXR]

    sia nella prima sia nella seconda

    int leggiMatrice(int maxr, int m[][MAXR], int *r, int *c);
    int riconosciRegione(int nr, int nc, int M[][MAXR],int r, int c, int *bp, int *hp);
    Ultima modifica di oregon; 29-10-2016 a 20:31
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22
    Fatto ti ringrazio, ma comunque il problema non è risolto!! Se la matrice viene acquisita correttamente (anche con la correzione che mi hai suggerito) perché quando la passo all'altra funzione mi riconosce solo l'elemento 0,0 ?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da rino95 Visualizza il messaggio
    Fatto ti ringrazio, ma comunque il problema non è risolto!! Se la matrice viene acquisita correttamente (anche con la correzione che mi hai suggerito) perché quando la passo all'altra funzione mi riconosce solo l'elemento 0,0 ?
    Ma l'hai ricompilato con le modifiche e provato? A me dà questo risultato

    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



    P.S. Correggi il \code in /code nel post con il codice in modo che si legga.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22
    Si giuro l'ho fatto! Ho cambiato le intestazioni delle funzioni sia nel prototipo che nella dichiarazione come hai detto tu, ma niente ottengo lo stesso risultato... visto che a te funziona allora vuol dire che è il mio compilatore o pc il problema proprio come speravo, ciò vuol dire che il codice è giusto! Ti ringrazio dei suggerimenti!
    ps la prossima volta proverò a impostare il tag code correttamente, purtroppo non mi faceva già più accedere alla domanda per modificarla dopo che hai risposto tu.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mi sembra strano ... riproponi adesso tutto il codice modificato (con i tag code corretti) così lo controllo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22
    Vero hai ragione, avevo soltanto corretto "int *M[][nc]" in "int M[][nc]" e "int *m[][maxr]" in "int m[][maxr]", ora invece ho riscritto in "int M[][MAXR]" e "int m[][MAXR]" ed effettivamente funziona tutto come previsto!! Grazie mille!
    Ultima modifica di rino95; 31-10-2016 a 08:26

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.