Probleme de segmentation

biba -  
 biba -
Bonjour,
lors de l'execution d'un programme c compilé avec gcc, j'obtiendrai un message d'erreur de segmentation lorsque je le lance à partir du pas >à 3.
~$ ./testlu 10 5
Segmentation fault
avec 10 est la taille maximale de la matrice et 5 pas d'incrementation.
Someone can help me please!
Configuration: Linux / Firefox 3.0.18

1 réponse

  1. jack sparow
     
    salut
    je pense qu'il faut avoir le code complet pour chercher une solution
    0
    1. biba
       
      salut jack,voilà mon code complet de factorisation LU:
      #include<stdio.h>
      #include<stdlib.h>
      #include<omp.h>
      #include <time.h>
      #include<valgrind/callgrind.h>

      int main(int argc,char** argv)
      {
      float *a,*l,*u,somme=0,*b/*ax=b*/,*z/* lz=b et z=ux */, *x;
      int i, j,k,dim,n,inc;
      double nsec,rap,ordre;
      struct timespec start, end;


      /*La taille maximale de la matrice et pas d'incrementation*/
      n=atoi(argv[1]);
      inc=atoi(argv[2]);


      for(dim=0; dim<=n; dim=dim+inc)
      {
      /*allocation des trois matrices */
      a=(float*)malloc(dim*dim*sizeof(float));
      l=(float*)malloc(dim*dim*sizeof(float));
      u=(float*)malloc(dim*dim*sizeof(float));
      b=(float*)malloc(dim*sizeof(float));
      /*Allocation du vecteur z et x */
      z=(float*)malloc(dim*sizeof(float));
      x=(float*)malloc(dim*sizeof(float));


      /*initialisation de la matrice a */
      #pragma omp parallel for private(i,j)
      for(i=0;i<dim;i++)
      for(j=0;j<dim;j++)
      a[i*dim+j]=i*j-1;

      /* Initialisation du vecteur b */
      #pragma omp parallel for private(i)
      for(i=0;i<dim;i++)
      b[i]=i-15;

      CALLGRIND_ZERO_STATS;
      //lecture du temps début
      clock_gettime(CLOCK_THREAD_CPUTIME_ID,&start);


      /*détermination des matrices l et u */

      u[0]=a[0]; /* le premier élément de u est le même que celui de a */
      #pragma omp parallel
      {
      #pragma omp parallel for
      for(j=1;j<dim;j++)
      {
      u[j]=a[j]; /*les éléments de la première ligne de u sont les mêmes que ceux de a */
      l[dim*j]=a[dim*j]/a[0]; /*les éléments de la première colonne de l */
      }
      }

      /* calcul des autres éléments de l et u */
      #pragma omp prallel
      {
      #pragma omp prallel for
      for(i=1;i<dim-1;i++)
      { somme=0;
      for(k=0;k<i;k++)
      somme+=l[dim*i+k]*u[dim*k+i];

      u[dim*i+i]=a[dim*i+i]-somme;/*la diagonale de u */


      for(j=i;j<dim;j++) /* les autres éléments de u et de l */
      { somme=0;

      for(k=0;k<i;k++)
      somme+=l[dim*i+k]*u[dim*k+j];
      u[dim*i+j]=a[dim*i+j]-somme;

      somme=0;

      for(k=0;k<i;k++)
      somme+=l[dim*j+k]*u[k*dim+i];
      l[dim*j+i]=(a[dim*j+i]-somme)/u[dim*i+i];
      }
      }
      }
      /* calcul du dernier élément de u */
      somme=0;

      #pragma omp parallel for reduction(+:somme)
      for(k=0;k<dim-1;k++)
      somme+=l[dim*(dim-1)+k]*u[(dim*k)+dim-1];


      u[dim*dim-1]=a[dim*dim-1]-somme;

      /* les éléments nuls et égaux à 1 dans l */
      #pragma omp parallel
      for(i=0;i<dim;i++)
      l[dim*i+i]=1;


      /* affichage des trois matrices */
      /*
      printf("\nLa matrice a est: \n");
      for(i=0;i<dim;i++)
      { printf("\n");
      for(j=0;j<dim;j++)
      { printf(" | ");
      printf("%f",a[dim*i+j]);
      printf(" ");
      }
      printf(" |");
      printf("\n");
      }
      printf("\n");

      printf("\nLa matrice l est:\n ");
      for(i=0;i<dim;i++)
      { printf("\n");
      for(j=0;j<dim;j++)
      { printf(" | ");
      printf("%f",l[dim*i+j]);
      printf(" ");
      }
      printf(" |");
      printf("\n");
      }

      printf("\nLa matrice u est:\n ");
      for(i=0;i<dim;i++)
      { printf("\n");
      for(j=0;j<dim;j++)
      {printf(" | ");
      printf("%f",u[dim*i+j]);
      printf(" ");
      }
      printf(" |");
      printf("\n");
      }
      */
      /* résolution du système linéaire*/


      /*Determination des éléments de z */
      z[0]=b[0];
      #pragma omp parallel
      {
      #pragma omp parallel for private (j,somme)
      for(i=1;i<dim;i++)
      { somme=0;
      for(j=0;j<i;j++)
      somme+=l[dim*i+j]*z[j];
      z[i]=b[i]-somme;
      }
      }

      /* Determination du vecteur x avec ux=z */
      x[dim-1]=z[dim-1]/u[dim*dim-1];

      #pragma omp parallel for private(j,somme)
      for(i=dim-2;i>=0;i--)
      { somme=0;
      for(j=i;j<dim;j++)
      somme+=u[dim*i+j]*x[j];

      x[i]=(z[i]-somme)/u[dim*i+i];
      }


      CALLGRIND_DUMP_STATS;
      // lecture du temps d'arrêt
      clock_gettime(CLOCK_THREAD_CPUTIME_ID,&end);


      // calcul de l'intervalle
      nsec =(end.tv_sec * 1000000000 + end.tv_nsec) - (start.tv_sec * 1000000000 + start.tv_nsec) ;

      /* Affichage du vecteur x */
      /* printf(" ------\n");
      for(i=0;i<dim;i++)
      { printf("| %f |\n",x[i]);
      printf(" ------\n");
      }
      */
      /* liberer la memoire */

      free(a);
      free(b);
      free(l);
      free(u);
      ordre=dim*dim*dim;
      rap=nsec/ordre;


      /* affiche le temp d'execution */
      printf("dimension ordre temp rapport\n");
      printf("%d %f %f %f\n",dim,ordre,nsec,rap);

      }


      return(0);
      }
      0