Problème de malloc

cs_sylvain230 Messages postés 67 Date d'inscription mardi 5 décembre 2000 Statut Membre Dernière intervention 5 juillet 2010 - 17 juin 2010 à 11:53
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 17 juin 2010 à 16:41
Bonjour,

Je ne comprends pas mon problème. Ca doit être un problème de réallocation

Voila mon code :

// Initialisation de fen_remontee de -2 à +2
int cpt = -2;
int demi_fen_remontee = 2 ;
unsigned int i_max ;

double * signal_fen;
pic_potentiels[nb_decomposition] = (unsigned long*) malloc( taille * sizeof( unsigned long) );
//signal_fen = (double*) malloc ( taille * sizeof(double) );



for(unsigned int i_ech = nb_decomposition - 1 ; i_ech > 0 ; i_ech--)
{

printf ( "Etude de l'echelle : %u " , i_ech ) ;
printf(" \n");
signal_fen = (double*) malloc ( tailles_ond[i_ech ] * sizeof(double) );

// On copie notre signal dans une variable temporaire
for( i = 0 ; i < tailles_ond[i_ech] ; i++)
{
//printf("%f \n", ond_d[i_ech][i]);
signal_fen[i] = abs(ond_d[i_ech][i]); // On récupère les valeurs de chaque décomposition et on prend la valeur absolue
}

// On rajoute les pic potentiels à la suite
for(unsigned int i_pic = 0 ; i_pic < nb_pics[i_ech] ;i_pic++)
{
pic_potentiels[nb_decomposition][ i_pic + nb_pics[nb_decomposition] ] = pic_potentiels[i_ech] [ i_pic ];
}
nb_pics[nb_decomposition] = nb_pics[nb_decomposition] + nb_pics[i_ech];


//pic_potentiels[nb_decomposition] = (unsigned long*)malloc( nb_pics[nb_decomposition] * sizeof(unsigned long) );

// On cherche le maximum sur notre intervalle
for(unsigned int i_pic = 0 ; i_pic < nb_pics[nb_decomposition] ; i_pic++)
{


pic_potentiels[nb_decomposition][i_pic] = pic_potentiels[nb_decomposition][i_pic]*2 ;
max( & ( signal_fen [ pic_potentiels[nb_decomposition][i_pic] - demi_fen_remontee ] ) , 2*demi_fen_remontee+1 , & i_max );
pic_potentiels[nb_decomposition][i_pic] = pic_potentiels[nb_decomposition][i_pic] - demi_fen_remontee + i_max ;
}

FILE * fic ;
fic = fopen ( "D:\\tmp\\decomposition.txt" , "w" ) ;
double * sig_pics = ( double * ) malloc ( tailles_ond[i_ech] * sizeof ( double ) ) ;
double v_min , v_max ;

v_min = min ( signal_fen , tailles_ond[i_ech], NULL ) ;
v_max = max ( signal_fen , tailles_ond[i_ech], NULL ) ;

for( j = 0 ; j < tailles_ond[i_ech] ; j++)
{
sig_pics [ j ] = v_min ;
//printf("%f \n" ,sig_pics [ j ]);
//fprintf ( fic , "%f \n" /*,signal_fen[j]*/ ,sig_pics [ j ] ) ;
}

for( j = 0 ; j < nb_pics[i_ech ] ; j++)
{
sig_pics [ pic_potentiels[nb_decomposition][j] ] = v_max ;
printf ( "%f\n" ,sig_pics [ pic_potentiels[nb_decomposition][j] ]) ;
}
printf ( "Taille = %u\n" , tailles_ond[i_ech] ) ;

for ( j = 0 ; j < tailles_ond[i_ech ] ; j++ )
{
//sig_pics [ j ] = v_min ;
//signal_fen [ j ] = v_min ;
printf("%f \n" ,signal_fen[j]);
printf("%f \n" ,sig_pics [j]);
//fprintf ( fic , " %f \n" ,signal_fen[j] ,sig_pics [j] ) ;
//fprintf ( fic , " %e \n" ,signal_fen[j] ) ;
}
fclose ( fic ) ;
free(signal_fen);
}
for(unsigned int i_pic = 0 ; i_pic < nb_pics[0] ;i_pic++)
{
pic_potentiels[ nb_decomposition ][ i_pic + nb_pics[nb_decomposition] ] = pic_potentiels[ 0] [ i_pic ];
}
nb_pics[nb_decomposition] = nb_pics[nb_decomposition] + nb_pics[0];



Je peux faire un tour de boucle.
J'arrive à afficher les valeurs signal_fen[j] et sig_pics [j] mais je ne peux pas faire un fprintf ( fic , " %f \n" ,signal_fen[j] ,sig_pics [j] ) ;

Il me dit :

Windows a déclenché un point d'arrêt dans StageM1.exe.

Cela peut être dû à une défaillance du tas qui indique un bogue dans StageM1.exe ou l'une des DLL chargées.

Cela peut également être dû à l'appui sur la touche F12 lorsque StageM1.exe a le focus.

La fenêtre Sortie peut contenir des informations de diagnostic supplémentaires.



La je vois vraiment pas
Aidez moi svp merci d'avance !!
Hésitez pas à poser des questions si vous ne comprenez pas mon problème

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
17 juin 2010 à 13:09
Si tu peux me faire un exemple qui met en avant ton problème et qui compile, je peux t'aider à le débugger.

PS: Tu fais du C ou du C++ ? Je serais tenté de dire que tu fais du C. Dans ce cas, si tu as besoin de "caster" les retours de ton malloc, c'est que tu utilises un compilateur C++ pour faire du C (dev-c++ ?). Attention, certaines choses du C ne sont pas prises en charge par un compilateur C++ (ou pris différemment). Cette remarque n'a pas de rapport avec ton problème.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_sylvain230 Messages postés 67 Date d'inscription mardi 5 décembre 2000 Statut Membre Dernière intervention 5 juillet 2010
17 juin 2010 à 14:28
En gros je peux faire ca :

printf("%f \n" ,signal_fen[j]);

Mais je ne peux pas faire ca :

fprintf(fic, "%f \n" ,signal_fen[j]);

L'initialisation de signal_fen est :

double * signal_fen;
signal_fen = (double*) malloc ( tailles_ond[i_ech ] * sizeof(double) );

Sachant que pour tailles_ond[ i_ech ] : On a
unsigned int * tailles_ond = (unsigned int*) malloc( nb_decomposition * sizeof(double) );

En fait on est sur une décomposition par ondelettes db4 et nb_decomposition correspond au nombre de fois ou l'on a décomposé le signal.

En fait je crois qu'il y a tout simplement une différence avec ca
pic_potentiels[nb_decomposition][i_pic] = pic_potentiels[nb_decomposition][i_pic] *2 ;

et ca

pic_potentiels[nb_decomposition][i_pic] = (pic_potentiels[nb_decomposition][i_pic]) *2 ;

C'est possible ?

PS: Je fais plutot du C et du C++ quand ca m'arrange. C'est peut être pas une bonne idée.
Je travaille sous VS 2010.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
17 juin 2010 à 16:41

pic_potentiels[nb_decomposition][i_pic] = pic_potentiels[nb_decomposition][i_pic] *2 ;
pic_potentiels[nb_decomposition][i_pic] = (pic_potentiels[nb_decomposition][i_pic]) *2 ;

Sont strictements identiques.

Sans code que je peux compiler, j'aurais du mal à t'aider à cerner l'erreur.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
Rejoignez-nous