Flux rss
Collection CommentÇaMarche.net
Rechercher : dans
Par :

[C] erreur de segmentation

tophe03, le mardi 21 novembre 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

1

mamiemando, le mercredi 22 novembre 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 mercredi 22 novembre 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 jeudi 23 novembre 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 jeudi 23 novembre 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 jeudi 23 novembre 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 jeudi 23 novembre 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 vendredi 24 novembre 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 mardi 28 novembre 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
[visual C++] erreur icone Bonjour!!!! Je suis en train de créer une application sur visual c++ express 2005 et j'ai voulu mettre une icone pour la fenetre principale à côté du titre de la form mais j'ai une erreur lorsque je lance l'application : Une exception non gérée du... www.commentcamarche.net/forum/affich-2716593-visual-c-erreur-icone
Windows live messenger (c.erreur 80048820) (Résolu) Salut, j'ai un petit problème avec mon msn, je travaille sur windows live messanger ( la derinière version) le problème c'est que lorsque j'éssaie d'ouvrir ma session le messenger me signale qu'il est impossible de me connecter, après il me propose... www.commentcamarche.net/forum/affich-3410022-windows-live-messenger-c-erreur-80048820
[Visual C++] erreur à la compilation (Résolu) Bonjour, J'utilise actuellement le code dont le lien est le suivant : http://www.codeproject.com/audio/ExtrtactAVIFrames.asp qui permet d'extraire les images d'une vidéo et de les transformer en bitmap. Voici les erreurs à la compilation que je ne... www.commentcamarche.net/forum/affich-2098813-visual-c-erreur-a-la-compilation
La compilation et les modules en C et en C++Cet 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... www.commentcamarche.net/faq/sujet-14440-la-compilation-et-les-modules-en-c-et-en-c
MSN - Erreur de connexion 80048439Erreur 80048439 Avant toute modification sur votre système, vérifiez l'état des serveurs MSN Messenger, afin de déterminer si le problème ne vient pas de là : http://messenger.msn.com/Status.aspx?mkt=fr-fr Il peut également s'agir d'un problème... www.commentcamarche.net/faq/sujet-6123-msn-erreur-de-connexion-80048439
Gestion des erreursPar défaut, en Pascal, la gestion des erreurs est assurée par le compilateur. C’est pour cette raison que le programme s’arrête en affichant un message commençant par Runtime error suivi par le numéro de l’erreur … Alors si le programmeur désire... www.commentcamarche.net/faq/sujet-7546-gestion-des-erreurs
Microsoft Visual C++ Runtime LibraryBonjour à tous et merci à ceux qui liront ce message. Je suis sous Windows 2000. Lorsque je joue à un jeu (CS, AOM, NWN), le message d'erreur suivant s'affiche au début de la partie : Microsoft Visual C++ Runtime Library Runtime error! program : « le... www.commentcamarche.net/forum/affich-212424-microsoft-visual-c-runtime-library
[Visual C++]Erreur à l'execution avec des dllsalut, j'ai un probleme sous visual(je decouvre ce logiciel!) mon programme compil mais lorsque je veux l'executer la console s'affiche puis disparait quasi directement et j'ai ensuite un tas d'erreur du genre : 'joao.exe' : Chargé... www.commentcamarche.net/forum/affich-2723991-visual-c-erreur-a-l-execution-avec-des-dll
Visual C++ - Erreur C1083Bonjour tout le monde ! Je suis en train de faire une DLL sous Visual C++. J'ai donc créer mon fichier .c via Win32 DLL. Cette dernière appelle une librairie "commonDLL.h" qui appelle elle-même d'autres librairies. Toutes ces librairies sont utilisées... www.commentcamarche.net/forum/affich-2699855-visual-c-erreur-c1083