Création
d'entreprise
Posez votre question Signaler

[C] erreur de segmentation

tophe03 311Messages postés 24 janvier 2005Date d'inscription - Dernière réponse le 28 nov. 2006 à 13:27
Bonjour,
J'ai un programme qui se compile très bien.
Lorsque je l'exécute, le prog plante. Lorsque j'uitilise le debugger, au bout d'un certain temps d'eécution, j'ai un message du style "vilation d'accès (erreur de segmentation)...". Qu'est-ce qu cela signifie?
Merci
Lire la suite 

[C] erreur de segmentation »

8 réponses
Réponse
+0
moins plus
Celà signifie que tu accède à une zone mémoire non allouée (erreur typique en C quand on commence à manipuler des pointeurs ou des tableaux).

Exemple :
#include <stdio.h>

int main(){
  int tab[5];
  printf("%d\n",tab[69]); //seg fault car tab[69] est hors du tableau
  int *x;
  *x = 28; // seg fault, car *x est un entier non alloué
  return 0;
}

Solution :
#include <stdio.h>
#include <stdlib.h>

int main(){
  int tab[70];
  printf("%d\n",tab[69]);
  int *x =(int*)malloc(sizeof(int));
  *x = 28;
  return 0;
}

Comment détecter une segmentation fault avec gcc+gdb :
gcc -g -W -Wall -o plop.exe plop.c
gdb plop.exe

Dans gdb :
r
bt

A noter que pour windows dev cpp est basé sur gcc...

Bonne chance
tophe03- 22 nov. 2006 à 20:47
Bonjour

Je vois pas trop où j'aurais pu faire une erreur.
Voici une partie du code:

double *saisie_pol(HINSTANCE hinst, HWND hEdit, double *coefs, int deg)
{
    
	for(q=deg;q>=0;q--)
	{
         
      DialogBoxParam(hinst, "DIALOG4", hEdit, (DLGPROC)Dialog4Proc, (LPARAM)hEdit);
      
      coefs[q] = *cfs;
      free(cfs);

	}
	
	return coefs;
}

char *saisie_degre(HINSTANCE hinst, HWND hEdit, polynome *p, double *coefs, int deg, int nb_poly, char *szBuffer1)
{
     int m = 0;
     char *szBuffer;
     szBuffer = (char*)malloc(256*sizeof(char));
     
     if (nb_poly == 0)
          deg = (int)DialogBoxParam(hinst, "DIALOG2", hEdit, (DLGPROC)Dialog2Proc, (LPARAM)hEdit);
     else if (nb_poly == 1)
          deg = (int)DialogBoxParam(hinst, "DIALOG3", hEdit, (DLGPROC)Dialog3Proc, (LPARAM)hEdit);
     new_pol(&p[nb_poly],deg);
     saisie_pol(hinst, hEdit, coefs, deg);
     init_pol(&p[nb_poly],coefs);
     m += sprintf(szBuffer, "p%d(x) = %s", nb_poly + 1, afficher(&p[nb_poly], szBuffer1));
     free(szBuffer1);
     
     return szBuffer;
}

void MainWnd_Command(HINSTANCE hinst, HWND hEdit, WPARAM wParam)
{
     char *buf, *temp;
     int m, deg, nb_poly;
     double *coefs, eval, x;
     polynome *tampon, *p;
     
     buf = (char*)malloc(256*sizeof(char));
     temp = (char*)malloc(256*sizeof(char));
     coefs = (double*)malloc((deg+1)*sizeof(double));
     tampon = (polynome*)malloc(2*sizeof(polynome));
     p = (polynome*)malloc(2*sizeof(polynome));

     m = 0;

    if (LOWORD(wParam) == IDM_DERIV)
     {

           m = sprintf(buf, "Polynôme à dériver:\r\n    %s", saisie_degre(hinst, hEdit, &p[0], coefs, deg, 0, temp));
           free(temp);
           tampon[0] = derive(p[0]);
           m += sprintf(buf + m, "\r\n\r\n    p1'(x) = %s", afficher(&tampon[0], temp));
           free(temp);
     }

else if (LOWORD(wParam) == IDM_SOMME)
     {

           m = sprintf(buf + m, "Polynômes à ajouter:\r\n    %s\r\n    ", saisie_degre(hinst, hEdit, &p[0], coefs, deg, 0, temp));
           free(temp);
           m += sprintf(buf + m, "%s", saisie_degre(hinst, hEdit, &p[1], coefs, deg, 1, temp));
           free(temp);
           tampon[0] = add(p[0],p[1]);
           m += sprintf(buf + m, "\r\n\r\n    p1(x) + p2(x) = %s", afficher(&tampon[0], temp));
           free(temp);
     }
  SetWindowText(hEdit, buf);
  free(tampon);
  free(p);
  free(buf);
}


Pour ce qui est de la dérivation (IDM_DERIV), ça marche.
Pour la somme (IDM_SOMME), c'est là que j'ai l'erreur.
Si j'intercale des "SetWindowText(hEdit, buf);" dans IDM_SOMME, les polynomes p[0] et p[1] s'affichent correctement. C'est après que ça se gâte, au niveau de tampon[0]=add(p[0],p[1]).

Si tu vois qcc de louche...
Merci
Ajouter un commentaire
Réponse
+0
moins plus
Ben là si j'ai pas tout le code je peux pas compiler et pas débugger. Donc soit tu me mets en gras la ligne ou le débugger dis seg fault soit il me faut tout le code. Tu peux aussi locaiser l'endroit ou ça plante avec des printf (genre "debut fonction f()" "fin fonction f()" etc...

Bonne chance
Ajouter un commentaire
Réponse
+0
moins plus
Salut.
un peu pareil, on a pas tout difficile de dire.
Peut être un problème avec new_pol() : si il y a un new ou un malloc dans cette fonction ça peut venir de là.
tu dit que ça plante à "tampon[0]=add(p[0],p[1]);"
je te conseil de faire :
p[0];
p[1];
tampon[0];
tampon[0]=add(p[0],p[1]);
Comme ça, tu saura exactement à l'apel de quoi ça plante.
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour

Voici la fonction add:

polynome add(polynome p1,polynome p2)
{
int i,deg;
polynome p;

deg = maxint(p1.degre,p2.degre);
	if(p1.degre == p2.degre)
	{
		while(p1.coef[deg] == -p2.coef[deg])
		{
		deg--;
		}
	}	
new_pol(&p,deg);

	for(i=p.degre;i>=0;i--)
	{
		if(i>p1.degre)		p.coef[i] = p2.coef[i];
		else if(i>p2.degre)	p.coef[i] = p1.coef[i];
		else			p.coef[i] = p1.coef[i]+p2.coef[i];
	}
return p;
}


Voici la fonction new_pol:

void new_pol(polynome *p,int deg)
{
int i;
	if(deg>0)	
	{
	p->degre = deg;
	p->coef = (double*)malloc(deg+1*sizeof(double));
	}
	else
	{
	p->degre = 0;
	p->coef = (double*)malloc(sizeof(double));
	}
}


et la fonction maxint:

int maxint(int x, int y)
{
	if(x > y)	return x;
	else	return y;
}


c'est une fois dans le fonction maxint que je me rend compte que le degré et les coefs de p[1] ne sont pplus pris en compte (deg=0, coefs=0X0) alors que ceux de p[0] ne posent pas de problèmes. L'erreur de segmentation survient ensuite lors du calcul des p.coef[i].

Si ça ne vous aide pas, je mettrais tout le code mais c'est un peu long.

Merci
Ajouter un commentaire
Réponse
+0
moins plus
Tant pis, mets le, car là je ne me sens pas à l'aise pour débugger si je n'ai pas tout le code.
Ajouter un commentaire
Réponse
+0
moins plus
dans new_pol, tu fait :
p->coef = (double*)malloc(deg+1*sizeof(double));
n'y aurait il pas une erreur ? (attention priorité opérateur)
p->coef = (double*)malloc((deg+1)*sizeof(double));
Me semble plus logique. a toi de voir.
Ajouter un commentaire
Réponse
+0
moins plus
bonjour,

Il y a effectivement une erreur dans new_pol, mais cela ne résoud pas mon problème.
Je vous donnerai le code entier dès que j'en aurais la possibilité car j'ai un souci d'ADSL depuis jeudi dernier.

Merci
Ajouter un commentaire
Ce document intitulé « [C] erreur de segmentation » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?