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


...La saggezza di un singolo somiglia ad un albero conficcato alla meno peggio nel terreno...( HAGAKURE, codice 15)
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

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


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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.


Ingegnere Informatico
https://ldlagency.it
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...


...La saggezza di un singolo somiglia ad un albero conficcato alla meno peggio nel terreno...( HAGAKURE, codice 15)
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
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.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote