Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    2

    [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. Mi dà errore di segmentazione nella riempi_matrice sulla fread al terzo giro del ciclo

    Ecco il codice che ho scritto:

    codice:
    #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);                             printf("2");      }      *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);      printf("1");      printf("\nnum= %d", *num);      printf("\ndim= %d", *dim); }  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);      printf("2"); }  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");      } }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    2
    codice:
    #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);
                                printf("2");
         }
         *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);
         printf("1");
         printf("\nnum= %d", *num);
         printf("\ndim= %d", *dim);
    }
    
    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);
         printf("2");
    }
    
    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");
         }
    }

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 © 2024 vBulletin Solutions, Inc. All rights reserved.