Oppure

Loading
20/05/11 17:07
zaire90
Salve a tutti, compilando un programma, il terminale mi scrive tutta questa roba:
*** glibc detected *** ./a: free(): invalid next size (normal): 0x095ac028 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x19a591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x19bde8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x19eecd]
/lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0x18aaaa]
./a[0x80495fd]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x145bd6]
./a[0x8048731]
======= Memory map: ========
00110000-0012d000 r-xp 00000000 08:05 122984     /lib/libgcc_s.so.1
0012d000-0012e000 r--p 0001c000 08:05 122984     /lib/libgcc_s.so.1
0012e000-0012f000 rw-p 0001d000 08:05 122984     /lib/libgcc_s.so.1
0012f000-00282000 r-xp 00000000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
00282000-00283000 ---p 00153000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
00283000-00285000 r--p 00153000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
00285000-00286000 rw-p 00155000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
00286000-00289000 rw-p 00000000 00:00 0 
003ff000-00400000 r-xp 00000000 00:00 0          [vdso]
00504000-005ed000 r-xp 00000000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
005ed000-005ee000 ---p 000e9000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
005ee000-005f2000 r--p 000e9000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
005f2000-005f3000 rw-p 000ed000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
005f3000-005fa000 rw-p 00000000 00:00 0 
00661000-00685000 r-xp 00000000 08:05 139146     /lib/tls/i686/cmov/libm-2.11.1.so
00685000-00686000 r--p 00023000 08:05 139146     /lib/tls/i686/cmov/libm-2.11.1.so
00686000-00687000 rw-p 00024000 08:05 139146     /lib/tls/i686/cmov/libm-2.11.1.so
00a70000-00a8b000 r-xp 00000000 08:05 122670     /lib/ld-2.11.1.so
00a8b000-00a8c000 r--p 0001a000 08:05 122670     /lib/ld-2.11.1.so
00a8c000-00a8d000 rw-p 0001b000 08:05 122670     /lib/ld-2.11.1.so
08048000-0804a000 r-xp 00000000 08:05 531964     /home/zaire90/Documenti/Desktop/a
0804a000-0804b000 r--p 00002000 08:05 531964     /home/zaire90/Documenti/Desktop/a
0804b000-0804c000 rw-p 00003000 08:05 531964     /home/zaire90/Documenti/Desktop/a
095ac000-095cd000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b77a1000-b77a3000 rw-p 00000000 00:00 0 
b77b2000-b77b6000 rw-p 00000000 00:00 0 
bfeb4000-bfec9000 rw-p 00000000 00:00 0          [stack]
Aborted
(è un programma per disegnare delle spline cubiche, per l'approssimazione delle funzioni..tanto x informazione) che cosa significa tutto ciò? eppure il programma mi sembra giusto!
Ultima modifica effettuata da zaire90 20/05/11 17:08
aaa
20/05/11 17:24
pierotofy
E vediamolo il programma... allega il sorgente.
Il mio blog: piero.dev
20/05/11 17:25
HeDo

controlla il sorgente, troverai che chiami free diverse volte sullo stesso puntatore senza riallocarlo.
aaa
20/05/11 20:41
zaire90
Eccolo qui:
# include <stdlib.h>
# include <stdio.h>
# include <math.h>

void init(int,double,double,double*,double*,double*);
void fattLU(int,double**,double*,double*,double*,double*,double*);
void costanti(int,double, double*,double*,double*,double*);
double Spline(int,double,double*,double*,double*,double*,double);
void norma_max(double*,int);

int main(void)
{
  int i, j, N;
  double l, r, h, x0, y1, y2;
  FILE *fp;
 
  printf("Inserisci il primo estremo:             l = ");  scanf("%lf",&l);
  printf("\nInserisci il secondo estremo:           r = "); scanf("%lf",&r);
  printf("\nInserire il numero di sottointervalli:  N = "); scanf("%d",&N);

  h=(r-l)/(double)(N);       // Quindi ci sono N+1 nodi
  
  double x[N+1], f[N+1], alfa[N-1], beta[N-2], y[N-1], M[N-1], d[N-1], C1[N-1], C2[N-1], Err[N];  
  double **a;

  a=(double**)calloc((N-1),sizeof(double*));    // Calloc inizializza i membri della matrice a 0
  for(i=0; i<(N-1); i++) {
    a[i]=(double*)calloc((N-1),sizeof(double));
  }

  init(N,h,l,x,f,d);                    // Memorizzazione dei nodi x, dei f(x) e dei termini noti d(i)
  
  fattLU(N,a,alfa,beta,d,y,M);       // Trovo gli M[i]

  costanti(N,h,f,M,C1,C2);              // Calcola le due costanti della Spline

  fp=fopen("Spline.dat","w");           // Apertura del file "Spline.dat", in cui scrivere dentro
     if (fp==NULL)
        {   printf("\n\nImpossibile");
            system("PAUSE"); exit(1);    }

  for(i=0; i<N; i++)
     {
        x0=(l+(h/2.)) + i*h;            // Creazione dei punti medi da interpolare x0 che si aggiornano ogni volta.
	y1=sin(x0);                     // Valore effettivo della f negli x0.
	y2=Spline(N,h,x,M,C1,C2,x0);    // Valore approssimato tramite la spline cubica
	Err[i]=fabs(y2-y1);             // Creazione del vettore degli errori
	fprintf(fp,"%lf\t%lf\t%lf\t%lf\n",x0,y1,y2,Err[i]);
     }

  norma_max(Err,N);
  fclose(fp);

  return 0;
}

void init(int N, double h, double l, double *x, double *f, double *d)
{
  int i;
  for(i=0; i<=N; i++)      // Memorizzo i nodi nel vettore x
     x[i]=l + i*h;

  for(i=0; i<=N; i++)
     f[i]=sin(x[i]);       // Memorizzo f calcolata sui nodi
  
  for(i=1; i<=(N-1); i++)
     d[i]=((3.)/(pow(h,2)))*(f[i+1] - 2*f[i] + f[i-1]);    // Vettore dei termini noti del sistema tridiagonale
  
  return;
} 
 
void fattLU(int N, double **a, double *alfa, double *beta, double *d, double *y, double *M)
{
  int i, j;
  
  a[0][0]=2;   a[0][1]=0.5;   a[N-2][N-3]=0.5;    a[N-2][N-2]=2;
  for(i=1; i<=(N-2); i++)
    for(j=1; j<=(N-2); j++)
      {
         if(i = j)        // Inizializzazione della matrice tridiagonale con gli 1 e gli 1/2
           {
              a[i][j]=2;
              a[i][j-1]=0.5;
              a[i][j+1]=0.5;
           }
      }

  /* for(i=0; i<(N-1); i++)   prova di stampa della matrice A, che funziona!, quindi il problema nn è qui
    for(j=0; j<(N-1); j++)
    printf("\na[%d][%d]=%lf",i,j,a[i][j]); */  
   
 
  alfa[0]=a[0][0];
  for(i=1; i<=(N-1); i++)
     {                                 // Calcolo dei coefficenti alfa[i], beta[i] e ci[i] delle matrici L e U
       beta[i]=(0.5)/(alfa[i-1]);
       alfa[i]=(2.) - beta[i]*(0.5);
     }
  
  y[0]=d[0];                         // Risolve il sistema AM=d risolvendo Ly=d e UM=y
  for(i=1; i<=(N-1); i++)            // Risolvo Ly=d
     y[i]=d[i] - beta[i]*y[i-1];   
  
  M[N-1]=y[N-1]/alfa[N-1];
  for(i=N-2; i>=0; i--)                     // Risolvo UM=y e da qui mi escono gli M[i]
    M[i]=(y[i] - M[i+1]*(0.5))/alfa[i];
 
  return;
}

void costanti(int N, double h, double *f, double *M, double *C1, double *C2)
{
  for(int i=1; i<=(N-1) ; i++)
     {
        C1[i-1]=(f[i]-f[i-1])/h - (h/(6.))*(M[i] - M[i-1]);
        C2[i-1]=f[i-1] - (M[i-1])*((pow(h,2))/(6.));
     }
  return;
}

double Spline(int N, double h, double *x, double *M, double *C1, double *C2, double x0)
{
  double S;
  for(int i=1; i<=(N-1); i++)
    S=M[i-1]*(pow((x[i]-x0),3)/(6*h)) + M[i]*(pow((x0-x[i-1]),3)/6*h) + C1[i-1]*(x0-x[i-1]) + C2[i-1];
  
  return S;
}

void norma_max(double* Err, int N)
{
    double max=Err[0];

    for(int i=1; i<N; i++)
       {
           if(max < Err[i])  
             {  
                 max=Err[i];
             }
       }   
    printf("\n\n\nLa norma infinito e' %lf\n\n\n\n",max);
    return;
}


Forse faccio qualche casino con tutti gli indici dei for...boh...
aaa
20/05/11 21:19
pierotofy
Penso dovrai studiare un po' meglio il capitolo sulla gestione della memoria del C...

double x[N+1], f[N+1], alfa[N-1], beta[N-2], y[N-1], M[N-1], d[N-1], C1[N-1], C2[N-1], Err[N];  


Non ha senso; il valore di N è sconosciuto prima dell'esecuzione, di conseguenza dovrai usare allocazione dinamica per inizializzare questi array.

Non è detto che questo risolverà il problema, ma è sicuramente da correggere.

Ah, e utilizza nomi più significativi per le tue variabili... è un guazzabuglio.
Il mio blog: piero.dev