[C]Matrice dinamica di dimensione presa da file

di il
23 risposte

23 Risposte - Pagina 2

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

    Ho fatto qualche cambiamento ed ora nn c'è + l'errore di segmentazione sul fread.
    Ecco il nuovo 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);
         }
         *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
         {    
              printf("%d/n%d/n",*dim,*num);
              *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=0;
         int j=0;
         int flag=0;
         fp=fopen("seq.dat","rb");
         while(flag<num)
         {
             if(flag==((num/2)+1))
             {
                 flag++;             
             }
             else
             {
                 fread(&m[i][j],sizeof(int),1,fp);
                 printf("\n%d    %d      %d        %d",i,j,num,flag);
                 flag++;
                 if(j<dim)
                 {
                     j++;
                 }
                 else
                 {
                     i++;
                     j=0;
                 }
             }
         }        
                 
                                        
         
         /*for(i=0;i<dim;i++)
         {
              for(j=0;j<dim;j++)
              {
                        if(flag==((num/2)+1)||flag<num)
                        {
                            if(flag>=num)
                            {
                                break;
                            }
                            else
                            {
                                flag++;
                            }                                
                        }
                        else
                        {
                            fread(&m[i][j],sizeof(int),1,fp);
                            flag++;
                            printf("\n%d    %d      %d        %d",i,j,num,flag);
                        }
              }
         } */   
         for(;i<dim;i++)
         {
                        for(;j<dim;j++)
                        {
                            (*m)[i][j]=0;
                            printf("\n%d    %d      %d        %d",i,j,num,flag);
                        }
         }        
         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");
         }
    }
    
    Ho un errore in questa linea di codice
    (*m)[i][j]=0;
    e sulla terza funzione, la stampa, nel passaggio della matrice
  • Re: [C]Matrice dinamica di dimensione presa da file

    Per l'ultima volta:
    
    *m=malloc((*dim)*sizeof(int));
    
    non va bene. *m è un puntatore ad un (array di un array di puntatori) quindi si aspetta un int ** e tu li fai tornare un int *. Tutti gli altri problemi sono legati a questo. Se lo vuoi cambiare nel giusto bene, altrimenti prossegui alla ciecca.
  • Re: [C]Matrice dinamica di dimensione presa da file

    Ma nn so come aggiustarlo
  • Re: [C]Matrice dinamica di dimensione presa da file

    Te lo già aggiustato io nel codice precedente
    
    *m=(int **)malloc((*dim)*sizeof(int *));
    
  • Re: [C]Matrice dinamica di dimensione presa da file

    Fatto, ma mi dà sempre gli stessi eroi citati sopra
  • Re: [C]Matrice dinamica di dimensione presa da file

    Debugger? linea x linea?
  • Re: [C]Matrice dinamica di dimensione presa da file

    Fatto ed è lì che mi dà il problema
  • Re: [C]Matrice dinamica di dimensione presa da file

    Va bene continua da solo allora. Lì mi da problema risolviamo un tubo. non è che gli altri devono creare un progetto solo per seguire il tuo. Debug linea x linea non significa quì si pianta ed è lì il problema.Significa ad ogni F8/F10 o non so che combinazione è stato assegnato al TRACE del debug verificare lo stato dei variabili e solo (SOLO) nel punto in cui si vede che le variabili non contengono ciò che uno si aspetta, solo lì si può dedurre che quella linea contiene un bug. Se il bug si presenta righe dopo con un assert o segmentation fault non è detto che dove si è fermato il programma si trovi anche il problema. Il problema si è creato prima e tu lo vedi solo quando capita qualcosa di spiacevole e nessuno può risolvere il tuo problema se non tu stesso.
  • Re: [C]Matrice dinamica di dimensione presa da file

    
        #include<stdio.h>
        #include<stdlib.h>
    
        void alloca_matrice(short***,int*,int*);
        void riempi_matrice(short***,int,int);
        void stampa(short**,int);
    
        int main()
        {
            short** 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(short***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,1,SEEK_CUR);
                                 
             }
             *dim=((*num)/2);
             fseek(fp,(*dim),SEEK_SET);
             fread(&(*dim),1,1,fp);
             if(((*dim)*(*dim))<(*num) - 1)
             {
                 printf("Il file contiene più interi di quanti ne puo' contenere la matrice");
                 exit(1);
             }
             else
             {   
                  *m = (short **)calloc((*dim),sizeof(short*));
                  for(i=0;i<(*dim);i++)
                  {
    				(*m)[i]= (short *)calloc((*dim),sizeof(short));
                  }
              }   
             fclose(fp);
           
        }
    
        void riempi_matrice(short*** m,int dim,int num)
        {
             FILE*fp=NULL;
             int i,j;
             int flag=0;
    		 short dummy = 0;
             fp=fopen("seq.dat","rb");
    			for(i=0;i<dim;i++)
    			{
    				for(j=0;j<dim;j++)
    				{
    					if(flag != (num - 1)/2)
    					{
    						fread(&(*m)[i][j],1,1,fp);
    					}
    					else
    					{
    						fread(&dummy,1,1,fp);
    						j--;
    					}
    					flag++;
    				}
    			}
             fclose(fp);
        }
    
        void stampa(short** m,int dim)
        {
    		
             int i,j;
    		 printf("\n\n");
             for(i=0;i<dim;i++)
             {
    			for(j=0;j<dim;j++)
    			{
    				printf("%-2d ", m[i][j]);
    			}
    			printf("\n");
             }
        }
    
    Questa è una modifica con un file in binario che contiene dei byte. questo è il file di input.
    http://www.2shared.com/file/T5G5g0Cb/SEQ.htm
Devi accedere o registrarti per scrivere nel forum
23 risposte