• Domingo 5 de Mayo de 2024, 02:15

Autor Tema:  Problema Segmentation Fault  (Leído 1375 veces)

Tempa

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problema Segmentation Fault
« en: Domingo 5 de Junio de 2011, 11:54 »
0
Hola,

Estoy trabajando con arreglos de 4 dimensiones y estoy definiendo los arreglos con la funcion malloc. Sin embargo, cuando incremento el tamano de alguno de los elementos, obtengo un segmentation fault pero no logro conseguir el por que. A continuacion pondre como defini mi funcion a ver si alguien puede ayudarme:

De esta manera defino lasa matrices:
    double ****Fd, ****Fdnew;
    double ****gxFd, ****gxFdnew;
    double ****gyFd, ****gyFdnew;
    double ****gvxFd, ****gvxFdnew;
    double ****gvyFd, ****gvyFdnew;

    double ****FIn;
    double ****gxFIn;
    double ****gyFIn;
    double ****gvxFIn;
    double ****gvyFIn;

    double ****Fo;
    double ****Fa, ****gxFa, ****gvxFa;
    double ****Fo1;  
    double ff, ff2, gg, gg2, vv, vv2;
   
            Fd = (double****)malloc(sizeof(double***)*ymax+2);
            Fdnew = (double****)malloc(sizeof(double***)*ymax+2);
            FIn = (double****)malloc(sizeof(double***)*ymax+2);
            Fa = (double****)malloc(sizeof(double***)*ymax+2);
            Fo = (double****)malloc(sizeof(double***)*ymax+2);
            Fo1 = (double****)malloc(sizeof(double***)*ymax+2);
           
            gxFd = (double****)malloc(sizeof(double***)*ymax+2);
            gxFIn = (double****)malloc(sizeof(double***)*ymax+2);
            gxFa = (double****)malloc(sizeof(double***)*ymax+2);
            gxFdnew = (double****)malloc(sizeof(double***)*ymax+2);
           
            gyFd = (double****)malloc(sizeof(double***)*ymax+2);
            gyFIn = (double****)malloc(sizeof(double***)*ymax+2);
            gyFdnew = (double****)malloc(sizeof(double***)*ymax+2);
           
            gvxFd = (double****)malloc(sizeof(double***)*ymax+2);
            gvxFIn = (double****)malloc(sizeof(double***)*ymax+2);
            gvxFdnew = (double****)malloc(sizeof(double***)*ymax+2);
           
            gvyFd = (double****)malloc(sizeof(double***)*ymax+2);
            gvyFIn = (double****)malloc(sizeof(double***)*ymax+2);
            gvyFdnew = (double****)malloc(sizeof(double***)*ymax+2);
           
            for(i=0;i<ymax+2;i++){
            Fd = (double***)malloc(sizeof(double**)*xmax+2);
            Fdnew = (double***)malloc(sizeof(double**)*xmax+2);
            Fo = (double***)malloc(sizeof(double**)*xmax+2);
            Fo1 = (double***)malloc(sizeof(double**)*xmax+2);
            FIn = (double***)malloc(sizeof(double**)*xmax+2);
            Fa = (double***)malloc(sizeof(double**)*xmax+2);
           
            gxFd = (double***)malloc(sizeof(double**)*xmax+2);
            gxFIn = (double***)malloc(sizeof(double**)*xmax+2);
            gxFa = (double***)malloc(sizeof(double**)*xmax+2);
            gxFdnew = (double***)malloc(sizeof(double**)*xmax+2);
           
            gyFd = (double***)malloc(sizeof(double**)*xmax+2);
            gyFIn = (double***)malloc(sizeof(double**)*xmax+2);
            gyFdnew = (double***)malloc(sizeof(double**)*xmax+2);
           
            gvxFd = (double***)malloc(sizeof(double**)*xmax+2);
            gvxFIn = (double***)malloc(sizeof(double**)*xmax+2);
            gvxFdnew = (double***)malloc(sizeof(double**)*xmax+2);
           
            gvyFd = (double***)malloc(sizeof(double**)*xmax+2);
            gvyFIn = (double***)malloc(sizeof(double**)*xmax+2);
            gvyFdnew = (double***)malloc(sizeof(double**)*xmax+2);
             
             
            for(j=0;j<xmax+2;j++){
            Fd[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            Fdnew[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            Fo[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            Fo1[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            FIn[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            Fa[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
           
            gxFd[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gxFdnew[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gxFIn[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gxFa[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
           
            gyFd[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gyFdnew[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gyFIn[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
           
            gvxFd[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gvxFdnew[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gvxFIn[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
           
            gvyFd[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gvyFdnew[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
            gvyFIn[j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
           
            for(p=0;p<2*Nmax+2;p++){
            Fd[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            Fdnew[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            Fo[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            Fo1[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            FIn[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            Fa[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
           
            gxFd[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gxFdnew[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gxFIn[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gxFa[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
           
            gyFd[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gyFdnew[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gyFIn[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
           
            gvxFd[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gvxFdnew[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gvxFIn[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
           
            gvyFd[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gvyFdnew[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
            gvyFIn[j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
           
           
            for(q=0;q<2*Mmax+2;q++){
            Fd[j][p][q] = 0.0;
            Fdnew[j][p][q] = 0.0;
            Fo[j][p][q] = 0.0;
            Fo1[j][p][q] = 0.0;
            FIn[j][p][q] = 0.0;
            Fa[j][p][q] = 0.0;
           
            gxFd[j][p][q] = 0.0;
            gxFdnew[j][p][q] = 0.0;
            gxFIn[j][p][q] = 0.0;
            gxFa[j][p][q] = 0.0;
           
            gyFd[j][p][q] = 0.0;
            gyFdnew[j][p][q] = 0.0;
            gyFIn[j][p][q] = 0.0;
           
            gvxFd[j][p][q] = 0.0;
            gvxFdnew[j][p][q] = 0.0;
            gvxFIn[j][p][q] = 0.0;
           
            gvyFd[j][p][q] = 0.0;
            gvyFdnew[j][p][q] = 0.0;
            gvyFIn[j][p][q] = 0.0;
           
             }                    
             }
             }
             }

Y esto las uso en una funcion como la siguiente:
void Init(double**** Fd, double**** gxFd, double****gyFd, double**** gvxFd, double**** gvyFd, double**** FIn,
double**** gxFIn, double**** gyFIn, double**** gvxFIn, double**** gvyFIn, double**** Fo, double****Fo1,
double* Vx, double* Vy, double nx)
{
   int i, j, p, q;
   
   for(i=0; i<=xmax+1; i++){ //Inicialmente lleno TODO x
        for(j=0; j<=ymax+1; j++){
             for(p=0; p<=2*Nmax+1; p++){
                  for(q=0; q<=2*Mmax+1; q++){
     
      Fo[j][p][q]= nx*(me/(2.0*Pi*k*Tg))*exp(-(me*((Vx[p]*Vx[p])+(Vy[q]*Vy[q]))/(2.0*k*Tg)));
      Fo1[j][p][q]= nx*(me/(2.0*Pi*k*Tg))*exp(-(me*(((Vx[p])*(Vx[p]))+(Vy[q]*Vy[q]))/(2.0*k*Tg))); //Fo desplazado pero tg
     
      Fd[j][p][q]= nx*(me/(2.0*Pi*k*Tei))*exp(-(me*(((Vx[p]-Vx[33])*(Vx[p]-Vx[33]))+(Vy[q]*Vy[q]))/(2.0*k*Tei)));
      gxFd[j][p][q]= 0.0;
      gyFd[j][p][q]= 0.0;
      gvxFd[j][p][q]= -((2.0*me*((Vx[p]-Vx[33])))/(k*Tei))*nx*sqrt(me/(2.0*Pi*k*Tei))*exp(-(me*(((Vx[p]-Vx[33])*(Vx[p]-Vx[33]))+(Vy[q]*Vy[q]))/(2.0*k*Tei)));
      gvyFd[j][p][q]= -((2.0*me*(Vy[q]))/(k*Tei))*nx*sqrt(me/(2.0*Pi*k*Tei))*exp(-(me*(((Vx[p]-Vx[33])*(Vx[p]-Vx[33]))+(Vy[q]*Vy[q]))/(2.0*k*Tei)));
     
      //Injection Function at the Inlet of the channel
      FIn[j][p][q]= nx*(me/(2.0*Pi*k*Tei))*exp(-(me*(((Vx[p]-Vx[33])*(Vx[p]-Vx[33]))+(Vy[q]*Vy[q]))/(2.0*k*Tei)));
      gxFIn[j][p][q]= 0.0;
      gyFIn[j][p][q]= 0.0;
      gvxFIn[j][p][q]= -((2.0*me*((Vx[p]-Vx[33])))/(k*Tei))*nx*sqrt(me/(2.0*Pi*k*Tei))*exp(-(me*(((Vx[p]-Vx[33])*(Vx[p]-Vx[33]))+(Vy[q]*Vy[q]))/(2.0*k*Tei)));
      gvyFIn[j][p][q]= -((2.0*me*(Vy[q]))/(k*Tei))*nx*sqrt(me/(2.0*Pi*k*Tei))*exp(-(me*(((Vx[p]-Vx[33])*(Vx[p]-Vx[33]))+(Vy[q]*Vy[q]))/(2.0*k*Tei)));//*/
     
                    }
                  }
                }      
              }
     }

Donde:
#define xmax 70
#define ymax 50
#define Nmax 30
#define Mmax 30

Se que es un poco tedioso. El programa funciona bien si xmax vale 50 o incluso con 60 funciona. El error se mantiene aun usando una computadora de mayor capacidad asi que no creo que ese sea el problema.

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Segmentation Fault
« Respuesta #1 en: Martes 7 de Junio de 2011, 17:30 »
0
Buenas

Los bucles estan mal, las dos primeras dimensiones tienen Matriz[ymax+2][xmax+2], pero la estas recorriendo Matriz[0 a xmax][0 a ymax]

Código: C
  1.  
  2. for(i=0; i<=xmax+1; i++){ //Inicialmente lleno TODO x
  3. for(j=0; j<=ymax+1; j++){
  4. for(p=0; p<=2*Nmax+1; p++){
  5. for(q=0; q<=2*Mmax+1; q++){
  6.  
  7.  

eso trandria que ser

Código: C
  1.  
  2. for(i=0; i<=ymax+1; i++){ //Inicialmente lleno TODO x
  3. for(j=0; j<=xmax+1; j++){
  4. for(p=0; p<=2*Nmax+1; p++){
  5. for(q=0; q<=2*Mmax+1; q++){
  6.  
  7.  

Saludos
The sweet smell of a great sorrow lies over the land.