[C]Matrice dinamica di dimensione presa da file

di il
23 risposte

[C]Matrice dinamica di dimensione presa da file

Ho un file di interi e sò solo che il numero totale degli interi è dispari. Della sequenza del file devo leggere l'intero centrale (ad es. se ho 13 interi devo leggere il 7). Il valore di questo intero è la dimensione della matrice quadrata che devo allocare dinamicamente. Dopo averla allocata dinamicamente, la devo riempire con gli interi del file, tranne quello che mi ha dato la dimensione. Se gli interi del file sono di meno degli elementi che può contenere la matrice, allora quelli rimanenti gli inizializzo a zero.

Non ho errori in compilazione, ma in esecuzione

Ecco il codice che ho scritto:
#include<stdio.h>
#include<stdlib.h>

void alloca_matrice(int***,int*,int*);
void riempi_matrice(int***,int,int);
void stampa(int**,int);

int main()
{
    int** matrice;
    int dimensione=0;
    int elementi=0;
    
    alloca_matrice(&matrice,&dimensione,&elementi);
    riempi_matrice(&matrice,dimensione,elementi);
    stampa(matrice,dimensione);
    system("pause");
    return 0;    
}

void alloca_matrice(int***m,int*dim,int*num)
{
     FILE* fp=NULL;
     int i;
     int end=0;
     fp=fopen("seq.dat","rb");
     fseek(fp,0,SEEK_END);
     end=ftell(fp);
     fseek(fp,0,SEEK_SET);
     while((ftell(fp))!=end)
     {
                            (*num)++;
                            fseek(fp,sizeof(int),SEEK_CUR);
                          
     }
     *dim=((*num)/2);
     fseek(fp,(*dim)*sizeof(int),SEEK_SET);
     fread(dim,sizeof(int),1,fp);
     if(((*dim)*(*dim))<(*num))
     {
         printf("Il file contiene più interi di quanti ne puo' contenere la matrice");
         exit(1);
     }
     else
     {    
          *m=malloc((*dim)*sizeof(int));
          for(i=0;i<(*dim);i++);
          {
                         (*m)=malloc((*dim)*sizeof(int));
          }
      }    
     fclose(fp);
  
}  

void riempi_matrice(int*** m,int dim,int num)
{
     FILE*fp=NULL;
     int i,j;
     int flag=0;
     fp=fopen("seq.dat","rb");
     do
     {
          for(i=0;i<dim;i++)
          {
                    for(j=0;j<dim;j++)
                    {
                        if(flag==((num/2)+1))
                        {}
                        else
                        {
                            fread((&m)[j],sizeof(int),1,fp);   f21 
                            flag++;
                          
                        }
                    }
          }    
     }
     while((i+j)<num);
     for(;i<dim;i++)
          {
                    for(;j<dim;j++)
                    {
                           (*m)[j]=0;
                    }
          }
     fclose(fp);
    
}

void stampa(int** m,int dim)
{
     int i,j;
     for(i=0;i<dim;i++)
     {
                       for(j=0;j<dim;j++)
                       {
                                         printf("%d", m[j]);
                       }
                       printf("/n");
     }
} 
indica dove attraverso il debug ho notato che mi dà errore. Per la precisione mi dà errore la seconda volta che la esegue, a causa del ciclo

23 Risposte

  • Re: [C]Matrice dinamica di dimensione presa da file

    Parti da correggere
    
    *m=malloc((*dim)*sizeof(int));
    for(i=0;i<(*dim);i++);
    {
          (*m)=malloc((*dim)*sizeof(int));
    }
    
    e
    
    fread((&m)[j],sizeof(int),1,fp);
    
    usa il debugger e trova gli errori.
  • Re: [C]Matrice dinamica di dimensione presa da file

    Ho usato il debugger e il problema è l'fread della funzione riempi_matrice. Mi dà errore la seconda volta che il ciclo passa da lì, Errore di segmentazione
  • Re: [C]Matrice dinamica di dimensione presa da file

    Ti ho detto di correggere gli errori, cosa hai corretto?
  • Re: [C]Matrice dinamica di dimensione presa da file

    Ho aggiustato gli errori da te segnalati e qualcun altro sempre dello stesso tipo
  • Re: [C]Matrice dinamica di dimensione presa da file

    E così dificile piazzare il codice corretto?
  • Re: [C]Matrice dinamica di dimensione presa da file

    Scusa....
    
    #include<stdio.h>
    #include<stdlib.h>
    
    void alloca_matrice(int***,int*,int*);
    void riempi_matrice(int***,int,int);
    void stampa(int**,int);
    
    int main()
    {
        int** matrice=NULL;
        int dimensione=0;
        int elementi=0;
        
        alloca_matrice(&matrice,&dimensione,&elementi);
        riempi_matrice(&matrice,dimensione,elementi);
        stampa(matrice,dimensione);
        system("pause");
        return 0;    
    }
    
    void alloca_matrice(int***m,int*dim,int*num)
    {
         FILE* fp=NULL;
         int i;
         int end=0;
         fp=fopen("seq.dat","rb");
         fseek(fp,0,SEEK_END);
         end=ftell(fp);
         fseek(fp,0,SEEK_SET);
         while((ftell(fp))!=end)
         {
                                (*num)++;
                                fseek(fp,sizeof(int),SEEK_CUR);
                             
         }
         *dim=((*num)/2);
         fseek(fp,(*dim)*sizeof(int),SEEK_SET);
         fread(dim,sizeof(int),1,fp);
         if(((*dim)*(*dim))<(*num))
         {
             printf("Il file contiene più interi di quanti ne puo' contenere la matrice");
             exit(1);
         }
         else
         {    
              *m=malloc((*dim)*sizeof(int));
              for(i=0;i<(*dim);i++);
              {
                             (*m)[i]=malloc((*dim)*sizeof(int));
              }
          }    
         fclose(fp);
        
    }
    
    void riempi_matrice(int*** m,int dim,int num)
    {
         FILE*fp=NULL;
         int i,j;
         int flag=0;
         fp=fopen("seq.dat","rb");
         do
         {
              for(i=0;i<dim;i++)
              {
                        for(j=0;j<dim;j++)
                        {
                            if(flag==((num/2)+1))
                            {}
                            else
                            {
                                fread((&m)[i][j],sizeof(int),1,fp);
                                flag++;
                                printf("\n%d    %d      %d        %d",i,j,num,flag);
                            }
                        }
              }    
         }
         while((i+j)<num);
         for(;i<dim;i++)
         {
                        for(;j<dim;j++)
                        {
                            (*m)[i][j]=0;
                        }
         }        
         fclose(fp);
     
    }
    
    void stampa(int** m,int dim)
    {
         int i,j;
         for(i=0;i<dim;i++)
         {
                           for(j=0;j<dim;j++)
                           {
                                             printf("%d", m[i][j]);
                           }
                           printf("/n");
         }
    }
  • Re: [C]Matrice dinamica di dimensione presa da file

    Continuiamo a non esserci. Non ti voglio dire l'errore perche voglio che ci arrivi da solo (tanto so che c'è la fai).
    
    *m=malloc((*dim)*sizeof(int));
    
    e
    
    fread((&m)[i][j],sizeof(int),1,fp);
    
  • Re: [C]Matrice dinamica di dimensione presa da file

    Ho cambiato la prima funzione, passando il doppio puntatore per argomento, visto che era inutile passarlo per indirizzo.
    Per quanto riguarda la seconda linea di codice la matrice essendo passata per indirizzo la sintassi dovrebbe essere questa. Cmq ho fatto alcune prove e togliendo la & mi dà errore di segmentazione sulla fread, e nn al terzo giro del ciclo, e quindi questa nn è la soluzione.
    Nn so che pesci pigliare
  • Re: [C]Matrice dinamica di dimensione presa da file

    Il primo allocamento si fa col doppio puntatore.
    
    *m=malloc((*dim)*sizeof(int *));
    
    il secondo se hai cambiato i parametri non so.
  • Re: [C]Matrice dinamica di dimensione presa da file

    Quindi devo presumere che il secodo errore che avevi trovato era la e commerciale(&). giusto?
  • Re: [C]Matrice dinamica di dimensione presa da file

    Posta le modifiche che hai fatto nel pasaggio parametri.
  • Re: [C]Matrice dinamica di dimensione presa da file

    Con passaggio del doppio puntatore per indirizzo:
    
    #include<stdio.h>
    #include<stdlib.h>
    
    void alloca_matrice(int***,int*,int*);
    void riempi_matrice(int***,int,int);
    void stampa(int**,int);
    
    int main()
    {
        int** matrice=NULL;
        int dimensione=0;
        int elementi=0;
        
        alloca_matrice(&matrice,&dimensione,&elementi);
        riempi_matrice(&matrice,dimensione,elementi);
        stampa(matrice,dimensione);
        system("pause");
        return 0;    
    }
    
    void alloca_matrice(int***m,int*dim,int*num)
    {
         FILE* fp=NULL;
         int i;
         int end=0;
         fp=fopen("seq.dat","rb");
         fseek(fp,0,SEEK_END);
         end=ftell(fp);
         fseek(fp,0,SEEK_SET);
         while((ftell(fp))!=end)
         {
                                (*num)++;
                                fseek(fp,sizeof(int),SEEK_CUR);
         }
         *dim=((*num)/2);
         fseek(fp,(*dim)*sizeof(int),SEEK_SET);
         fread(dim,sizeof(int),1,fp);
         if(((*dim)*(*dim))<(*num))
         {
             printf("Il file contiene più interi di quanti ne puo' contenere la matrice");
             exit(1);
         }
         else
         {    
              *m=malloc((*dim)*sizeof(int));
              for(i=0;i<(*dim);i++);
              {
                             (**m)[i]=malloc((*dim)*sizeof(int));
              }
          }    
         fclose(fp);
    }
    
    void riempi_matrice(int*** m,int dim,int num)
    {
         FILE*fp=NULL;
         int i,j;
         int flag=0;
         fp=fopen("seq.dat","rb");
         do
         {
              for(i=0;i<dim;i++)
              {
                        for(j=0;j<dim;j++)
                        {
                            if(flag==((num/2)+1))
                            {}
                            else
                            {
                                fread((&m)[i][j],sizeof(int),1,fp);
                                flag++;
                                printf("\n%d    %d      %d        %d",i,j,num,flag);
                            }
                        }
              }    
         }
         while((i+j)<num);
         for(;i<dim;i++)
         {
                        for(;j<dim;j++)
                        {
                            (*m)[i][j]=0;
                        }
         }        
         fclose(fp);
    }
    
    void stampa(int** m,int dim)
    {
         int i,j;
         for(i=0;i<dim;i++)
         {
                           for(j=0;j<dim;j++)
                           {
                                             printf("%d", m[i][j]);
                           }
                           printf("/n");
         }
    }
    
    Con passaggio del doppio puntatore per argomento:
    
    #include<stdio.h>
    #include<stdlib.h>
    
    void alloca_matrice(int***,int*,int*);
    void riempi_matrice(int***,int,int);
    void stampa(int**,int);
    
    int main()
    {
        int** matrice=NULL;
        int dimensione=0;
        int elementi=0;
        
        alloca_matrice(&matrice,&dimensione,&elementi);
        riempi_matrice(&matrice,dimensione,elementi);
        stampa(matrice,dimensione);
        system("pause");
        return 0;    
    }
    
    void alloca_matrice(int**m,int*dim,int*num)
    {
         FILE* fp=NULL;
         int i;
         int end=0;
         fp=fopen("seq.dat","rb");
         fseek(fp,0,SEEK_END);
         end=ftell(fp);
         fseek(fp,0,SEEK_SET);
         while((ftell(fp))!=end)
         {
                                (*num)++;
                                fseek(fp,sizeof(int),SEEK_CUR);
         }
         *dim=((*num)/2);
         fseek(fp,(*dim)*sizeof(int),SEEK_SET);
         fread(dim,sizeof(int),1,fp);
         if(((*dim)*(*dim))<(*num))
         {
             printf("Il file contiene più interi di quanti ne puo' contenere la matrice");
             exit(1);
         }
         else
         {    
              m=malloc((*dim)*sizeof(int));
              for(i=0;i<(*dim);i++);
              {
                             (*m)[i]=malloc((*dim)*sizeof(int));
              }
          }    
         fclose(fp);
    }
    
    void riempi_matrice(int*** m,int dim,int num)
    {
         FILE*fp=NULL;
         int i,j;
         int flag=0;
         fp=fopen("seq.dat","rb");
         do
         {
              for(i=0;i<dim;i++)
              {
                        for(j=0;j<dim;j++)
                        {
                            if(flag==((num/2)+1))
                            {}
                            else
                            {
                                fread((&m)[i][j],sizeof(int),1,fp);
                                flag++;
                                printf("\n%d    %d      %d        %d",i,j,num,flag);
                            }
                        }
              }    
         }
         while((i+j)<num);
         for(;i<dim;i++)
         {
                        for(;j<dim;j++)
                        {
                            (*m)[i][j]=0;
                        }
         }        
         fclose(fp);
    }
    
    void stampa(int** m,int dim)
    {
         int i,j;
         for(i=0;i<dim;i++)
         {
                           for(j=0;j<dim;j++)
                           {
                                             printf("%d", m[i][j]);
                           }
                           printf("/n");
         }
    }
    
  • Re: [C]Matrice dinamica di dimensione presa da file

    Prendiamo il primo caso visto che è in coerenza con le dichiarazioni delle funzioni mentre il secondo non lo è.
    
        #include<stdio.h>
        #include<stdlib.h>
    
        void alloca_matrice(int***,int*,int*);
        void riempi_matrice(int***,int,int);
        void stampa(int**,int);
    
        int main()
        {
            int** matrice=NULL;
            int dimensione=0;
            int elementi=0;
           
            alloca_matrice(&matrice,&dimensione,&elementi);
            riempi_matrice(&matrice,dimensione,elementi);
            stampa(matrice,dimensione);
            system("pause");
            return 0;   
        }
    
        void alloca_matrice(int***m,int*dim,int*num)
        {
             FILE* fp=NULL;
             int i;
             int end=0;
             fp=fopen("seq.dat","rb");
             fseek(fp,0,SEEK_END);
             end=ftell(fp);
             fseek(fp,0,SEEK_SET);
             while((ftell(fp))!=end)
             {
                                    (*num)++;
                                    fseek(fp,sizeof(int),SEEK_CUR);
             }
             *dim=((*num)/2);
             fseek(fp,(*dim)*sizeof(int),SEEK_SET);
             fread(dim,sizeof(int),1,fp);
             if(((*dim)*(*dim))<(*num))
             {
                 printf("Il file contiene più interi di quanti ne puo' contenere la matrice");
                 exit(1);
             }
             else
             {   
                  *m=malloc((*dim)*sizeof(int*));
                  for(i=0;i<(*dim);i++);
                  {
                                 (*m)[i]=malloc((*dim)*sizeof(int));
                  }
              }   
             fclose(fp);
        }
    
        void riempi_matrice(int*** m,int dim,int num)
        {
             FILE*fp=NULL;
             int i,j;
             int flag=0;
             fp=fopen("seq.dat","rb");
             do
             {
                  for(i=0;i<dim;i++)
                  {
                            for(j=0;j<dim;j++)
                            {
                                if(flag==((num/2)+1))
                                {}
                                else
                                {
                                    fread(&(*m)[i][j],sizeof(int),1,fp);
                                    flag++;
                                    printf("\n%d    %d      %d        %d",i,j,num,flag);
                                }
                            }
                  }   
             }
             while((i+j)<num);
             for(;i<dim;i++)
             {
                            for(;j<dim;j++)
                            {
                                (*m)[i][j]=0;
                            }
             }       
             fclose(fp);
        }
    
        void stampa(int** m,int dim)
        {
             int i,j;
             for(i=0;i<dim;i++)
             {
                               for(j=0;j<dim;j++)
                               {
                                                 printf("%d", m[i][j]);
                               }
                               printf("/n");
             }
        }
    
    
  • Re: [C]Matrice dinamica di dimensione presa da file

    Ok
Devi accedere o registrarti per scrivere nel forum
23 risposte