IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Probleme avec cette erreur : "Erreur de segmentation (core dumped)"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Par défaut Probleme avec cette erreur : "Erreur de segmentation (core dumped)"
    Bonjour, j'ai un projet en info a réalisé sur un CHarlyRobot 30, en bref recevoir un fichier en Gcode et le traduire en langage machine CharlyRobot mais la j'ai une erreur donc Erreur de segmentation (core dumped) et je ne sais pas ce que c'est, j'ai cru comprendre que c'etait en raport avec les bufer ou pointeur mais sinon rien d'autre donc voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    void Mouvement(char *chaine_entrante){
     
    printf("Entrer dans mouvement\n");
     
    /***************************initialisation des variables******************************************************/
    	int ret_rs_open  = 0;
    	unsigned char buffer_methode[5];
    	unsigned char buffer[46];
    	char *pointeur; 
    	int time_mvt =0, num_axe = 0;
    	int compteur_axe = 0;
    	int i = 0, j = 0;
    	int vit_X = 0, vit_Y = 0, vit_Z = 0,vit_Z_retour = 0;
    	char quel_axe;
    	char methode = ' ';
     
    	struct sigaction act;
        act.sa_handler = arret;
    	signal(SIGINT,arret);	/*Interception des signaux ctrl^c et ctrl^z*/
    	signal(SIGTSTP,arret);
     
     
    	ret_rs_open = RS_open("USB1",9600,8,1,'N',1);
     
    	printf("Test avant if");
     
    	if( ( ret_rs_open)!= -1){		/*On test si la liaison à été effectuée, si 'ret_rs_open' est égale à -1 cela veut dire que la liaison n'a pas fonctionner */
     
    /* On utilise la méthode strtok pour isoler les coordonnées et la méthode */
     
    		/*Premier appel du strtok*/
    		pointeur = strtok( chaine_entrante, " " );
     
    		if(strcmp(pointeur,"@0A") == 0){
    			buffer[i] = 0x40;
    			i++;
    			buffer[i] = 0x30;		//Deplacement relatif
    			i++;
    			buffer[i] = 0x41;
    			i++;
    			buffer[i] = 0x20;
    			i++;
    			methode = 'R';
    		}
    		else if(strcmp(pointeur,"@0M") == 0){
    			buffer[i] = 0x40;
    			i++;
    			buffer[i] = 0x30;		//Deplacement absolue
    			i++;
    			buffer[i] = 0x4D;
    			i++;
    			buffer[i] = 0x20;
    			i++;
    			methode = 'A';
    		}
    		else{
    			printf("Erreur de méthode de déplacement \n");
    			close(ret_rs_open);
    			exit(-1);	
    		}
     
     
    		while( pointeur != NULL ){
    			pointeur = strtok( NULL, ",");			/* puis on cherche les autres séparateur */
    			printf("Pointeur : %s \n",pointeur);
    			compteur_axe++;
     
    		/*Test de dépassement de l'espace de travail */
     
    				switch(compteur_axe){
    					case '1' :	quel_axe = 'X';
    								X = *pointeur;
    					case '2' :	quel_axe = 'X';
    								vit_X = *pointeur;
    					case '3' :	quel_axe = 'Y';
    								Y = *pointeur;
    					case '4' :	quel_axe = 'Y';
    								vit_Y = *pointeur;
    					case '5' :	quel_axe = 'Z';
    								Z = *pointeur;
    					case '6' :	quel_axe = 'Z';
    								vit_Z = *pointeur;
    					case '7' :	quel_axe = 'Z';
    								Z_retour = *pointeur;
    					case '8' :	quel_axe = 'Z';
    								vit_Z_retour = *pointeur;
     
    					default : printf("Default compteur axe");	
    				}
     
    			if(methode == 'A'){				/*Test si la methode est absolue*/
     
    				if( ( (*pointeur > 25000) && (compteur_axe == 1 || 2 )  ) || ( (*pointeur > 40000) && (compteur_axe == 3 || 4) ) || ( (*pointeur > 10000) && ( compteur_axe == 5) ) || ( (*pointeur< -10000) && (compteur_axe == 6 ) ) ){
     
    					printf("Erreur :: espace de travail de l'axe %c dépasser",quel_axe);
    					close(ret_rs_open);
    					exit(-1);
    				}
     
    			}
    			else if(methode == 'R'){		/*Ou relatif*/
     
    				if( ( ((*pointeur + X) > 25000) && (compteur_axe == 1 || 2 )  ) || ( (*pointeur > 40000) && (compteur_axe == 3 || 4) ) || ( (*pointeur > 10000) && ( compteur_axe == 5) ) || ( (*pointeur< -10000) && (compteur_axe == 6 ) ) ){ 
     
    					printf("Erreur :: espace de travail de l'axe %c dépasser",quel_axe);
    					close(ret_rs_open);
    					exit(-1);
     
    				}
    			}
     
    /*On lit les caractère scinder par strtok dans pointeur et on les entres dans le buffer pour l'envoie*/
     
    			for(j = 0; j > sizeof(&pointeur ); j++){
    				if(		*pointeur+j == '0')buffer[i] = 0x30;
    				else if(*pointeur+j == '1')buffer[i] = 0x31;
    				else if(*pointeur+j == '2')buffer[i] = 0x32;
    				else if(*pointeur+j == '3')buffer[i] = 0x33;
    				else if(*pointeur+j == '4')buffer[i] = 0x34;
    				else if(*pointeur+j == '5')buffer[i] = 0x35;
    				else if(*pointeur+j == '6')buffer[i] = 0x36;
    				else if(*pointeur+j == '7')buffer[i] = 0x37;
    				else if(*pointeur+j == '8')buffer[i] = 0x38;
    				else if(*pointeur+j == '9')buffer[i] = 0x39;
    				else if(*pointeur+j == '-')buffer[i] = 0x2D;
    				else{
    					printf("Erreur Caractère non connue"); 
    					close(ret_rs_open);
    					exit(-1);		
    				}
     
    				i++;
    			}
     
    			buffer[i] = 0x2C;
    			i++;
     
    		}
     
    		/********************************************on entre la configuration des axes**************************************************/
    /****On l'entre en dernier car pour connaitre le nombre d'axe il faut avoir finit le comptage d'axe grace a la methode strtok****/
    			buffer_methode[0]  = 0x40;
    			buffer_methode[1]  = 0x30;
     
    			switch(num_axe){			/* Test de num_axe, l'entier caluler grâce au strtok qui definie le nom_axe */
    				case '1' : buffer_methode[2] = 0x31;
    				case '3' : buffer_methode[2] = 0x33;
    				case '7' :
    				default : buffer_methode[2] = 0x37;
    			}
    			buffer_methode[3] = 0x0D;
    		RS_write(buffer_methode,4,ret_rs_open);			/* On envoie sur la liaison le contenu du buffer*/
    		RS_write(buffer,i,ret_rs_open);
     
     
     
    /************************Calcul du temps de déplacement pour faire le mouvement******************************/
     
    		if( (num_axe == '1') || (num_axe == '3') ){
    			time_mvt = 0;
    			time_mvt = (X/vit_X) + (Y/vit_Y);			
     
    		}
    		if( (num_axe == '7') ){
    			if( X > Y )			/*Si la distance X est plus grande que Y */
    			{
    				time_mvt = 0;
    				time_mvt = X/vit_X;		/*on calcule en seconde le temps que mais le charlyrobot pour aller en pos X a la vitesse vit_X*/		
    			}
     
    			else				/*Si la distance Y est plus grande que X */
    			{
    				time_mvt = 0;
    				time_mvt = Y/vit_Y;
    			}
    		}
     
    	}
    	else
    	{
    			printf("Erreur d'ouverture liaison \n");
    			exit(-1);
    	} 
     
    	sleep(time_mvt);
    	printf("Fermeture de la liaison \n");
    	close(ret_rs_open);
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Une erreur de segmentation a une unique cause symptomatique: l'accès à de la mémoire inaccessible.

    Des causes possibles sont:
    • déréférencement d'un pointeur null
    • écriture dans le segment de code (char* s = "alep"; *s='c';)
    • écriture dans n'importe quoi (int base; int *s = &base; *(s-17)=7;)


    Les principales raisons sont soit un code très moche, soit une incompréhension des fonctions de la bibliothèque standard.

    Ici, je dirai que c'est du aux lignes 115 et suivante.
    if( *pointeur+j == '0') ne fais pas ce que tu penses, à cause des priorités. La réalité est if( (*pointeur)+j == '0') alors que tu veux if( *(pointeur+j) == '0').
    Pour plus de lisibilité, tu peux écrire if(pointeur[j] == '0')

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Par défaut Re :
    J'ai essayé de remplacé mais j'ai toujours la même erreur !
    Deja j'ai assez de mal la comprendre la différence entre *pointeur et pointeur le premier est le contenu et l'autre le pointeur lui même mais c'est assez vague !

  4. #4
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    *pointeur c'est le contenu, c'est la valeur situé quelque part dans la mémoire.
    pointeur c'est où est en mémoire la valeur i.e l'adresse.


  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Par défaut re
    Ok oue d'accord c'est bien sa, c'est assez complexe quand même de comprendre la réels utilité des pointeurs !!

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Hmmm... je ne connais pas le langage CharlyRobot... mais en voyant des @0A... tu travailles quasiment avec des pointeurs...

    Imagine simplement :
    (la mémoire = un grand tableau numéroté)
    pointeur = le numéro d'une case (et juste le numéro de la case)
    *pointeur = le contenu de la case correspondant au numéro
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Premier problème potentiel, tu ne vérifies pas la validité du paramètre char *chaine_entrante ligne 1

    Je vais supposer qu'il est valide mais un test avec NULL et aussi sur sa longueur serait le bienvenu.

    Deuxième problème potentiel ligne 32-34 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		pointeur = strtok( chaine_entrante, " " );
     
    		if(strcmp(pointeur,"@0A") == 0){
    Si ta chaine entrante ne contient pas la chaine " ", pointeur vaut alors NULL. Il faudrait faire un test (ligne 33 justement puisqu'elle est vide) pour gérer ce cas de figure.

    Troisième problème potentiel, j'espère que tu te rends compte que strtok() va modifier la chaine de caractères pointée par la variable chaine_entrante. donc entre "avant" et "après" l'appel à la fonction Mouvement(), ta chaine est modifiée.

    Quatrième problème potentiel : le tableau qui reçoit tes ordres fait 46 octets. Si ta chaine est vraiment longue, tu risques de dépasser les bornes.

    Autre problème ligne 93, ça : *pointeur > 25000, (et les autres, c'est vraiment bizarre).

    pointeur et un char* donc *pointeur est un char et un char ne sera JAMAIS plus grand que 25000, je ne sais pas ce que tu as voulu faire.

    Tes tests ligne 93 et 103 sont compliqués à suivre, fait plus simple car cela ressemble à la chronique d'un bug futur.

    To switch est mal fait ligne 70, il manque tous les break pour chacun des cases.

    Ligne 114 et suivantes, for(j = 0; j > sizeof(&pointeur ); j++){, c'est bizarre.

    En fait, j'ai l'impression que ton code ressemble à ta pensée, c'est confus et donc tu ne sais pas le faire en simple (car je suis persuadé que ce code pourrait s'écrire de manière plus simple) pour permettre à un lecteur externe de comprendre exactement le cheminement du code et donc l'idée qu'il y a derrière.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Troisième problème potentiel, j'espère que tu te rends compte que strtok() va modifier la chaine de caractères pointée par la variable chaine_entrante. donc entre "avant" et "après" l'appel à la fonction Mouvement(), ta chaine est modifiée.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Par défaut
    Oue je n'avais pas très bien compris je croyais que sa supprimer les caractère avant le strtok.
    en tout cas merci c'est sur le point de fonctionner encore quelque petit erreur simple et c'est bon !!
    Merci bien

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    leternel t'a déjà fourni la réponse :
    Citation Envoyé par leternel Voir le message
    Ici, je dirai que c'est du aux lignes 115 et suivante.
    if( *pointeur+j == '0') ne fais pas ce que tu penses, à cause des priorités. La réalité est if( (*pointeur)+j == '0') alors que tu veux if( *(pointeur+j) == '0').
    Pour plus de lisibilité, tu peux écrire if(pointeur[j] == '0')
    Donc remplace tous tes if((*pointeur+j) == 'N') par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*(pointeur+j) == 'N')
    ou

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Par défaut
    A oui mince désolées ça y est remplacé mais toujours cette erreur c'est énervant !!

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    A un moment, il faut apprendre à utiliser le debugger. La première fois, c'est peut être un peu dur mais cela permet de gagner un ntemps fou sur ce genre de problèmes.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Par défaut
    Euh je veux bien mais comment on fait ??

    ps : je travaille juste sur gedit

Discussions similaires

  1. Erreur de segmentation (core dumped) avec dsyev/dspev
    Par juliefournet dans le forum Fortran
    Réponses: 1
    Dernier message: 09/02/2013, 20h42
  2. Réponses: 6
    Dernier message: 14/01/2008, 16h47
  3. erreur de segmentation core dumped
    Par panganino dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 12h45
  4. Réponses: 5
    Dernier message: 04/11/2007, 13h39
  5. Probleme avec Make -->[all-recursive] Erreur 1
    Par lolodelp dans le forum Installation
    Réponses: 3
    Dernier message: 18/04/2006, 23h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo