Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - errore strano nella compilazione
Forum - C/C++ - errore strano nella compilazione

Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 19:07
Venerdì, 20/05/2011
Salve a tutti, compilando un programma, il terminale mi scrive tutta questa roba:
Codice sorgente - presumibilmente C/C++

  1. *** glibc detected *** ./a: free(): invalid next size (normal): 0x095ac028 ***
  2. ======= Backtrace: =========
  3. /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x19a591]
  4. /lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x19bde8]
  5. /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x19eecd]
  6. /lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0x18aaaa]
  7. ./a[0x80495fd]
  8. /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x145bd6]
  9. ./a[0x8048731]
  10. ======= Memory map: ========
  11. 00110000-0012d000 r-xp 00000000 08:05 122984     /lib/libgcc_s.so.1
  12. 0012d000-0012e000 r--p 0001c000 08:05 122984     /lib/libgcc_s.so.1
  13. 0012e000-0012f000 rw-p 0001d000 08:05 122984     /lib/libgcc_s.so.1
  14. 0012f000-00282000 r-xp 00000000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
  15. 00282000-00283000 ---p 00153000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
  16. 00283000-00285000 r--p 00153000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
  17. 00285000-00286000 rw-p 00155000 08:05 139141     /lib/tls/i686/cmov/libc-2.11.1.so
  18. 00286000-00289000 rw-p 00000000 00:00 0
  19. 003ff000-00400000 r-xp 00000000 00:00 0          [vdso]
  20. 00504000-005ed000 r-xp 00000000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
  21. 005ed000-005ee000 ---p 000e9000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
  22. 005ee000-005f2000 r--p 000e9000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
  23. 005f2000-005f3000 rw-p 000ed000 08:05 89964      /usr/lib/libstdc++.so.6.0.13
  24. 005f3000-005fa000 rw-p 00000000 00:00 0
  25. 00661000-00685000 r-xp 00000000 08:05 139146     /lib/tls/i686/cmov/libm-2.11.1.so
  26. 00685000-00686000 r--p 00023000 08:05 139146     /lib/tls/i686/cmov/libm-2.11.1.so
  27. 00686000-00687000 rw-p 00024000 08:05 139146     /lib/tls/i686/cmov/libm-2.11.1.so
  28. 00a70000-00a8b000 r-xp 00000000 08:05 122670     /lib/ld-2.11.1.so
  29. 00a8b000-00a8c000 r--p 0001a000 08:05 122670     /lib/ld-2.11.1.so
  30. 00a8c000-00a8d000 rw-p 0001b000 08:05 122670     /lib/ld-2.11.1.so
  31. 08048000-0804a000 r-xp 00000000 08:05 531964     /home/zaire90/Documenti/Desktop/a
  32. 0804a000-0804b000 r--p 00002000 08:05 531964     /home/zaire90/Documenti/Desktop/a
  33. 0804b000-0804c000 rw-p 00003000 08:05 531964     /home/zaire90/Documenti/Desktop/a
  34. 095ac000-095cd000 rw-p 00000000 00:00 0          [heap]
  35. b7600000-b7621000 rw-p 00000000 00:00 0
  36. b7621000-b7700000 ---p 00000000 00:00 0
  37. b77a1000-b77a3000 rw-p 00000000 00:00 0
  38. b77b2000-b77b6000 rw-p 00000000 00:00 0
  39. bfeb4000-bfec9000 rw-p 00000000 00:00 0          [stack]
  40. 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 il 20/05/2011 alle 19:08
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6222
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:24
Venerdì, 20/05/2011
E vediamolo il programma... allega il sorgente.


Il mio blog: https://piero.dev
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 19:25
Venerdì, 20/05/2011

controlla il sorgente, troverai che chiami free diverse volte sullo stesso puntatore senza riallocarlo.

PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 22:41
Venerdì, 20/05/2011
Eccolo qui:
Codice sorgente - presumibilmente C#

  1. # include <stdlib.h>
  2. # include <stdio.h>
  3. # include <math.h>
  4.  
  5. void init(int,double,double,double*,double*,double*);
  6. void fattLU(int,double**,double*,double*,double*,double*,double*);
  7. void costanti(int,double, double*,double*,double*,double*);
  8. double Spline(int,double,double*,double*,double*,double*,double);
  9. void norma_max(double*,int);
  10.  
  11. int main(void)
  12. {
  13.   int i, j, N;
  14.   double l, r, h, x0, y1, y2;
  15.   FILE *fp;
  16.  
  17.   printf("Inserisci il primo estremo:             l = ");  scanf("%lf",&l);
  18.   printf("\nInserisci il secondo estremo:           r = "); scanf("%lf",&r);
  19.   printf("\nInserire il numero di sottointervalli:  N = "); scanf("%d",&N);
  20.  
  21.   h=(r-l)/(double)(N);       // Quindi ci sono N+1 nodi
  22.  
  23.   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];  
  24.   double **a;
  25.  
  26.   a=(double**)calloc((N-1),sizeof(double*));    // Calloc inizializza i membri della matrice a 0
  27.   for(i=0; i<(N-1); i++) {
  28.     a[i]=(double*)calloc((N-1),sizeof(double));
  29.   }
  30.  
  31.   init(N,h,l,x,f,d);                    // Memorizzazione dei nodi x, dei f(x) e dei termini noti d(i)
  32.  
  33.   fattLU(N,a,alfa,beta,d,y,M);       // Trovo gli M[i]
  34.  
  35.   costanti(N,h,f,M,C1,C2);              // Calcola le due costanti della Spline
  36.  
  37.   fp=fopen("Spline.dat","w");           // Apertura del file "Spline.dat", in cui scrivere dentro
  38.      if (fp==NULL)
  39.         {   printf("\n\nImpossibile");
  40.             system("PAUSE"); exit(1);    }
  41.  
  42.   for(i=0; i<N; i++)
  43.      {
  44.         x0=(l+(h/2.)) + i*h;            // Creazione dei punti medi da interpolare x0 che si aggiornano ogni volta.
  45.         y1=sin(x0);                     // Valore effettivo della f negli x0.
  46.         y2=Spline(N,h,x,M,C1,C2,x0);    // Valore approssimato tramite la spline cubica
  47.         Err[i]=fabs(y2-y1);             // Creazione del vettore degli errori
  48.         fprintf(fp,"%lf\t%lf\t%lf\t%lf\n",x0,y1,y2,Err[i]);
  49.      }
  50.  
  51.   norma_max(Err,N);
  52.   fclose(fp);
  53.  
  54.   return 0;
  55. }
  56.  
  57. void init(int N, double h, double l, double *x, double *f, double *d)
  58. {
  59.   int i;
  60.   for(i=0; i<=N; i++)      // Memorizzo i nodi nel vettore x
  61.      x[i]=l + i*h;
  62.  
  63.   for(i=0; i<=N; i++)
  64.      f[i]=sin(x[i]);       // Memorizzo f calcolata sui nodi
  65.  
  66.   for(i=1; i<=(N-1); i++)
  67.      d[i]=((3.)/(pow(h,2)))*(f[i+1] - 2*f[i] + f[i-1]);    // Vettore dei termini noti del sistema tridiagonale
  68.  
  69.   return;
  70. }
  71.  
  72. void fattLU(int N, double **a, double *alfa, double *beta, double *d, double *y, double *M)
  73. {
  74.   int i, j;
  75.  
  76.   a[0][0]=2;   a[0][1]=0.5;   a[N-2][N-3]=0.5;    a[N-2][N-2]=2;
  77.   for(i=1; i<=(N-2); i++)
  78.     for(j=1; j<=(N-2); j++)
  79.       {
  80.          if(i = j)        // Inizializzazione della matrice tridiagonale con gli 1 e gli 1/2
  81.            {
  82.               a[i][j]=2;
  83.               a[i][j-1]=0.5;
  84.               a[i][j+1]=0.5;
  85.            }
  86.       }
  87.  
  88.   /* for(i=0; i<(N-1); i++)   prova di stampa della matrice A, che funziona!, quindi il problema nn è qui
  89.     for(j=0; j<(N-1); j++)
  90.     printf("\na[%d][%d]=%lf",i,j,a[i][j]); */  
  91.    
  92.  
  93.   alfa[0]=a[0][0];
  94.   for(i=1; i<=(N-1); i++)
  95.      {                                 // Calcolo dei coefficenti alfa[i], beta[i] e ci[i] delle matrici L e U
  96.        beta[i]=(0.5)/(alfa[i-1]);
  97.        alfa[i]=(2.) - beta[i]*(0.5);
  98.      }
  99.  
  100.   y[0]=d[0];                         // Risolve il sistema AM=d risolvendo Ly=d e UM=y
  101.   for(i=1; i<=(N-1); i++)            // Risolvo Ly=d
  102.      y[i]=d[i] - beta[i]*y[i-1];  
  103.  
  104.   M[N-1]=y[N-1]/alfa[N-1];
  105.   for(i=N-2; i>=0; i--)                     // Risolvo UM=y e da qui mi escono gli M[i]
  106.     M[i]=(y[i] - M[i+1]*(0.5))/alfa[i];
  107.  
  108.   return;
  109. }
  110.  
  111. void costanti(int N, double h, double *f, double *M, double *C1, double *C2)
  112. {
  113.   for(int i=1; i<=(N-1) ; i++)
  114.      {
  115.         C1[i-1]=(f[i]-f[i-1])/h - (h/(6.))*(M[i] - M[i-1]);
  116.         C2[i-1]=f[i-1] - (M[i-1])*((pow(h,2))/(6.));
  117.      }
  118.   return;
  119. }
  120.  
  121. double Spline(int N, double h, double *x, double *M, double *C1, double *C2, double x0)
  122. {
  123.   double S;
  124.   for(int i=1; i<=(N-1); i++)
  125.     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];
  126.  
  127.   return S;
  128. }
  129.  
  130. void norma_max(double* Err, int N)
  131. {
  132.     double max=Err[0];
  133.  
  134.     for(int i=1; i<N; i++)
  135.        {
  136.            if(max < Err[i])  
  137.              {  
  138.                  max=Err[i];
  139.              }
  140.        }  
  141.     printf("\n\n\nLa norma infinito e' %lf\n\n\n\n",max);
  142.     return;
  143. }



Forse faccio qualche casino con tutti gli indici dei for...boh...

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6222
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:19
Venerdì, 20/05/2011
Penso dovrai studiare un po' meglio il capitolo sulla gestione della memoria del C...

Codice sorgente - presumibilmente C/C++

  1. 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: https://piero.dev
PM Quote