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 :

[erreur] Segmentation fault


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut [erreur] Segmentation fault
    Bonjour,

    J'ai un léger souci avec mon programme.
    Ce programme tourne sous linux et la cible est de l'embarqué avec un réseau Konnex et un maquette.

    Quand je cherche à lire la trame de changement de l'état d'une sortie provoqué par l'appui d'un bouton poussoir le programme me retourne Segmentation fault :


    Voici un bout du 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
     
     
     do
        {
         		read(file_def, &lecture, 1);
         		switch(lecture)
         		{
         			case  '\x68' : if (etape == 0)
         								{
         									etape ++;
         									buf[i++] = lecture;
         									printf(" %02x", lecture);
         								}
         						   else if ((etape == 1)&&(nb_length == 2))
         						   		{
         						   			etape ++;
         						   			buf[i++] = lecture;
         						   			printf(" %02x", lecture);
         						   		}
         						   break;
     
         			case '\x16' : if ((etape == 2)&&(nb_corps == 11))//&&(checksum = buf[i-1]))
         						  {
         						  	buf[i] = lecture;
         						  	printf(" %02x", lecture);
         						  	fin_lecture = 1;
         						  }
         						  break;
     
         			default : if (etape == 1)
         							{
         								length = lecture;
         								buf[i++] = lecture;
         								printf(" %02x", lecture);
         								nb_length ++;
         							}
         					  else if (etape == 2)
         					  		{
         					  			buf[i++] = lecture;
         					  			printf(" %02x", lecture);
         					  			nb_corps ++; 
         					  			//if (checksum != lecture)
         					  				checksum +=lecture; 
     
         					  		}
         					  break;     		
         		}
     
          }while (!fin_lecture);
    Merci pour vos reponses

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Je n'ai rien modifié à part l'indentation, mais ça devrait être un peu plus lisible comme ça.
    (je passe sur les espaces entre if et parenthèse, je trouve ça illisible, mais il parait que c'est une question de goût : je ne les supprimerai que si d'autres pensent comme moi)
    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
    do
    {
    	read(file_def, &lecture, 1);
    	switch(lecture)
    	{
    	case  '\x68' :
    		if (etape == 0)
    		{
    			etape ++;
    			buf[i++] = lecture;
    			printf(" %02x", lecture);
    		}
    		else if ((etape == 1)&&(nb_length == 2))
    		{
    			etape ++;
    			buf[i++] = lecture;
    			printf(" %02x", lecture);
    		}
    		break;
     
    	case '\x16' :
    		if ((etape == 2)&&(nb_corps == 11))//&&(checksum = buf[i-1]))
    		{
    			buf[i] = lecture;
    			printf(" %02x", lecture);
    			fin_lecture = 1;
    		}
    		break;
     
    	default :
    		if (etape == 1)
    		{
    			length = lecture;
    			buf[i++] = lecture;
    			printf(" %02x", lecture);
    			nb_length ++;
    		}
    		else if (etape == 2)
    		{
    			buf[i++] = lecture;
    			printf(" %02x", lecture);
    			nb_corps ++; 
    			//if (checksum != lecture)
    			checksum +=lecture; 
    		}
    		break;     		
    	}//switch
     
    } while (!fin_lecture);
    PS: On ne connait ni buf, ni lecture, ni aucune autre variable en fait (mais celles-ci sont les plus importantes, puisqu'utilisées comme buffers)...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut
    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
     
    #include <termios.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <string.h>
     
     
    #define TAILLE_BUF 16
     
     
     
    int main(void)
     {
     
        //Local variables    
        int i, balise, nb_length, nb_corps, etape, fin_lecture, compare, file_def;
        char lecture, checksum, length;
        char buf[TAILLE_BUF];
     
        bzero(buf, TAILLE_BUF);
        write (file_def, "\x68\x08\x08\x68\x73\xA9\x00\x18\x34\x56\x78\x0A\x40\x16",14);
         compare = 0;    
        i = 0;
        balise = 0;
        etape = 0;
        length = 0;
        nb_length = 0;
        nb_corps = 0;
        fin_lecture = 0;
        checksum = '\x00';
        sleep(1);
         do
        {
         	read(file_def, &lecture, 1);
         	switch(lecture)
         	{
         	        case  '\x68' : if (etape == 0)
         	                          {
         	                          	etape ++;
    	                          	buf[i++] = lecture;
                                      		printf(" %02x", lecture);
                                            }
         		              else if ((etape == 1)&&(nb_length == 2))
         			 {
         				etape ++;
         				buf[i++] = lecture;
         				printf(" %02x", lecture);
         			 }
         			  break;
     
        	         case '\x16' : if ((etape == 2)&&(nb_corps == 11))
    		             {
         			  	buf[i] = lecture;
         				printf(" %02x", lecture);
         				fin_lecture = 1;
         		              }
         			  break;
     
         	          default : if (etape == 1)
         		 	{
         			             length = lecture;
         				buf[i++] = lecture;
         				printf(" %02x", lecture);
         				nb_length ++;
         		             }
                                        else if (etape == 2)
         			{
         				buf[i++] = lecture;
         				printf(" %02x", lecture);
         				nb_corps ++; 
         			             chexksum += lecture; 
    		  	}
         			  break;   
     
     
         	   }
     
          }while (!fin_lecture);
     
     
                return (0);
    Désolé pour la mise en forme mais je suis obligé de faire des copiés collé en passant par le bloc notes.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fveysseire
    Voici un bout du code :
    Magnifique !

    http://emmanuel-delahaye.developpez.com/goret.htm

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Même avec le bloc-notes, tu pourrais au moins corriger...
    Edit: première chose: Tu te rends compte qu'une de tes premières instructions, c'est d'écrire avec les fonctions bas niveau non-portables dans un descripteur de fichier non-initialisé?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut
    C'est à dire Medinoc ?

    avec le write?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int file_def;
    write (file_def, "\x68\x08\x08\x68\x73\xA9\x00\x18\x34\x56\x78\x0A\x40\x16",14);
    1°) aucune initialisation de file_def entre les deux,
    2°) il est inutile et non-portable d'employer write() là où fwrite() suffirait...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    J'ai comme l'impression que tu te moques ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut
    Cher medinoc le file_def est definit cependant je ne peux sortir tout le code de mon entreprise.

    Le file_def est défini grace à un file_def = open(DEVICE, FLAGS);

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut
    C vrai que j'aurais pu le dire car avec je que j'ai montrer je serais arriver à la meme conclusion que toi.

  11. #11
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Tu as un candidat sérieux à la segmentation fault, c'est ton buffer buf...
    Vérifie si buf[i] ou buf[i++] ne te fait pas sortir de ta zone de 16 caractères...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 138
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par joellel
    Tu as un candidat sérieux à la segmentation fault, c'est ton buffer buf...
    Vérifie si buf[i] ou buf[i++] ne te fait pas sortir de ta zone de 16 caractères...
    Merci Joellel ca vient de la

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Matplotlib: erreur Segmentation fault
    Par L1011 dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 11/05/2011, 16h38
  2. erreur segmentation fault à l'execution
    Par g.abdou dans le forum Réseau
    Réponses: 3
    Dernier message: 18/02/2011, 01h56
  3. Traiter une erreur "Segmentation Fault"
    Par Looney dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2009, 06h51
  4. erreur "Segmentation Fault" lors de l'import d'un dump
    Par farenheiit dans le forum Import/Export
    Réponses: 13
    Dernier message: 28/11/2007, 10h17
  5. Réponses: 2
    Dernier message: 08/04/2007, 17h23

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