CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

aide : debuggage programme c

parmac
parmac
Niveau 6
28 mai 2008 à 13:32:46

bonjour
j'ai réalisé un programme en langage C pour calculé la transformée de fourier rapide à partir d'un échantillon de points.

je précise tout de suite que je programme avec Dev-C++ sous Windows Vista (je sais , niveau compatibilité c'est pas top!)

Seulement j'ai un problème: quand je prend un échantillon de 2^n valeurs avec n=1, 2 ou 3 (c'est a dire jusqu'a 8 valeurs) ça marche nickel (ça me renvoi les valeurs des coefficients de fourier en complexe) mais a partir de n=4 je rentre toutes mes valeurs et puis ça quitte ("fourier.exe a cessé de fonctionné"... erreur de segmentation je suppose)

j'aimerais savoir à quoi ça peut-etre dû (mauvaise allocation mémoire?) et comment je pourrait réglé ça.

merci d'avance

  1. include <stdio.h>
  2. include <math.h>
  3. include <complex.h>

void valeur(float complex *X, float *n);
int Kapa(int m, int j2, int k);
void tfr(float complex *X, float n);

int main()
{
float n;
int h;

float complex *X ;
X= malloc(((int)pow(2,n)) * sizeof(float complex));

valeur(X,&n); /* recuperation des X[j] */

tfr(X,n);

for (h=0;h<((int)pow(2,n));h++)
printf ("resultat re : %f , im : %f \n",creal(X[h]), cimag(X[h]));

free (X);
free (n);

system("pause");
}

void tfr(float complex *X, float n)
{
float Nm,Mm,Rm;
float complex e,a,b,cvar;
int p,var, taille_X,m,k,j;

float complex *Y ;
Y= (float complex *) malloc(((int)pow(2,n)) * sizeof(float complex));

taille_X=(int) pow(2,n);

m=1;var=0;

while (m<n+1)
{
Nm=pow(2,m);
Mm=Nm/2;
Rm=pow(2,n-m);
k=0;
while(k<Mm)
{
cvar = I*3.141592654*(-2)*k/Nm;
e = cexp(cvar);

j=0;
while (j<Rm)
{
var=Kapa(m-1,j,k);

a = X[var];
var=Kapa(m-1,Rm+j,k);
//calcul de kapa
b = X[var] * e;

Y [Kapa(m, j, k)] = (a + b)/2 ;
Y [Kapa(m, j,Mm + k)] = (a-b)/2;
j++;
}
k++;
}
taille_X=(int)(pow(2.0,n));
p=0;
while (p< taille_X)
{
X[p]=Y[p];
p++;
}
m++;
}

free(Y);
}

void valeur(float complex *X, float *n)

{
int i, taille_X;
float *r;

printf("préciser n tel que le nombre de points fasse 2 exposant n : ");

scanf("%f", n);

printf("\n");
taille_X=pow(2,*n); // elevation à la puissance avec pow de la librairie math

i=0;
while (i<((int)taille_X))
{
printf("\n valeur num %d :" ,i);
scanf("%f",X+i);
printf("%d , %f \n",X+i,creal(X[i]));
i++;

}

}

int Kapa(int m, int j2, int k)
{
float Kapa1;
int Kapa2;
Kapa1=j2*pow(2,m)+k;
Kapa2=(int)(Kapa1);

return Kapa2;
}

parmac
parmac
Niveau 6
28 mai 2008 à 14:13:01

ce qui est bizarre c'est que quand je l'execute avec le debuggeur ça marche

WhiteNerdy
WhiteNerdy
Niveau 6
28 mai 2008 à 14:54:58

il y a le free (n); dans la main, qui est une erreur je pense : quand tu tapes "float n;" n est alloué sur la pile, et sera libéré à la fin de la fonction main (et donc du programme), de plus free reçois un pointeur en argument, si tu lui passe un float ça risque très fortement de merder.

Si ça marche toujours pas, le fait que ça marche avec le débuggeur indique peut être un dépassement sur un tableau.

parmac
parmac
Niveau 6
29 mai 2008 à 16:32:21

c'etait en effet un dépassement d'adresse au niveau du tableau

godrik
godrik
Niveau 30
29 mai 2008 à 22:42:07

j'arrive apres la bataille, mais pour ce genre d'erreur, les outils de verification mémoire (comme valgrind sous linux) sont tres efficace.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment