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...
[MSN] Erreurs 0x81000301 ou 0x81000310 Voirerreurs 0x81000301 et 0x81000310 Si vous n'avez pas XP ou si la restauration a échouée, essayez les solutions ci-dessous, trouvées sur différents forums 1. Problème connection MSN Messenger 0*8100030 2. Problème ouverture de session Msn 3....
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Segmentation de la mémoire en assembleur VoirQu'est-ce que la segmentation de la mémoire ? En assembleur, on appelle segment de mémoire le mécanisme de base de la gestion des adresses pour des processeurs de type 80x86. Les instructions sont stockées dans le registre IP. Il s'agit d'adresses...

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