Rechercher : dans
Par :

[C] erreur de segmentation

Dernière réponse le 28 nov 2006 à 13:27:02 tophe03, le 21 nov 2006 à 20:40:09 
 Signaler ce message aux modérateurs

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

Configuration: windows xp pro

Meilleures réponses pour « [C] erreur de segmentation » dans :
[Langage C] C/C++ Erreur de segmentation Voir Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...

1

mamiemando, le 22 nov 2006 à 01:02:24

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

Répondre à mamiemando

2

tophe03, le 22 nov 2006 à 20:47:51

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

Répondre à tophe03

3

mamiemando, le 23 nov 2006 à 01:22:26

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

Répondre à mamiemando

4

Char Snipeur, le 23 nov 2006 à 09:08:14

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

5

tophe03, le 23 nov 2006 à 17:13:12

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

Répondre à tophe03

6

mamiemando, le 23 nov 2006 à 20:22:13

Tant pis, mets le, car là je ne me sens pas à l'aise pour débugger si je n'ai pas tout le code.

Répondre à mamiemando

7

Char Snipeur, le 24 nov 2006 à 08:32:25

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

8

 tophe03, le 28 nov 2006 à 13:27:02

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

Répondre à tophe03
Collection CommentÇaMarche.net