Forum - C/C++
- errore strano nella compilazione
zaire90 (Normal User)
Rookie
Messaggi: 46
Iscritto: 16/10/2009
Salve a tutti, compilando un programma, il terminale mi scrive tutta questa roba:
Codice sorgente - presumibilmente C/C++
*** 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 il 20/05/2011 alle 19:08
pierotofy (Admin )
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
E vediamolo il programma... allega il sorgente.
HeDo (Founder Member )
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
controlla il sorgente, troverai che chiami free diverse volte sullo stesso puntatore senza riallocarlo.
zaire90 (Normal User)
Rookie
Messaggi: 46
Iscritto: 16/10/2009
Eccolo qui:
Codice sorgente - presumibilmente C#
# 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( "\n Inserisci il secondo estremo: r = " ) ; scanf( "%lf" ,& r) ;
printf( "\n Inserire 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 \n Impossibile" ) ;
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 \n La norma infinito e' %lf\n \n \n \n " ,max) ;
return;
}
Forse faccio qualche casino con tutti gli indici dei for...boh...
pierotofy (Admin )
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
Penso dovrai studiare un po' meglio il capitolo sulla gestione della memoria del C...
Codice sorgente - presumibilmente C/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.