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 :

Segmentation fault (debutant)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 318
    Par défaut Segmentation fault (debutant)
    Bonsoir,

    En fait j'ai un programme qui marche très bien sous windows, mais quand j'ai transposer mon programme sous LINUX, un message s'affiche SEGUMENTATION FAULT, et après un ami m'a dit que je gère pas la fin de la ligne, et je sais pas comment je vais la gèrer quelqu'un peut m'aider s'il vous plait.

    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
     
        m_File = fopen("C:\\test1.txt","rt");
     
    	if(!m_File) return 1;
     
    	i = 0;
    	j = 0;
        //--------------------- REMPLIR PetN   VOIX   DEPT
     
    	while(!feof(m_File))
    	{
    	    // On récupere la ligne courante du fichier
    		fgets(ligne,100,m_File);
     
    		// On decoupe la ligne selon le charactere de séparation SEP (" ")
    		token = strtok(ligne,SEP);
     
    		if (j==0)
    		{
                    while(token != NULL)
                    {
    			// On stocke la valeur lue dans le tableau
                        PetN[j] = atoi(token);
     
    			// On lit l'element suivant retourner par strtok
                        token = strtok(NULL,SEP);
    			// On incremente le compteur des ordonnées
                        j++;
                    }
    		}
            else
            {
    		// On lit les éléments découpés un à un et on les stocke dans le tableau Tab
    				while(token != NULL)
    		{
     
    			// On stocke la valeur lue dans le tableau
     
                dept[i] = token;
    			// On lit l'element suivant retourner par strtok
     
                token = strtok(NULL,SEP);
                voix[i] = atoi(token);
                token = strtok(NULL,SEP);
                    // On incremente le compteur des ordonnées
                i++;
    		}
            }
     
     
    	}

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Du mal à comprendre ce que fais ta fonction, malgré les commentaires...
    Sinon pour détecter les erreurs de segmentation, utilise valgrind ou gdb (très efficaces), (en compilant avec le -g de gcc).

    Sais tu précisément ou se produit ton erreur de segmentation ? Si non, pour le savoir, tu peux aussi faire des affichages. Une fois qu'on le saura on pourra peut être mieux voir.

    Poste un code qu'on peut compiler aussi, ca peut servir.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par maserati Voir le message
    En fait j'ai un programme qui marche très bien sous windows, mais quand j'ai transposer mon programme sous LINUX, un message s'affiche SEGUMENTATION FAULT, et après un ami m'a dit que je gère pas la fin de la ligne, et je sais pas comment je vais la gèrer quelqu'un peut m'aider s'il vous plait.
    Ce code est incomplet... Les commentaires sont destinés à un débutant qui lirait du C pour le première fois, mais n'aident pas à comprendre le rôle du programme.

    Donne un exemple de fichier à analyser et explique ce que tu veux en faire. J'ai comme l'impression qu'il faut un indice par tableau (ou un tableau de structures, ce qui serait plus logique que des tableaux 'parallèles').

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 318
    Par défaut
    Bonjour,
    Merci pour vos réponse, en fait oui j'ai poster que la partie importante du programme qui traite l'extraction de donnée depuis un fichier, et cependant j'aimerai savoir comment géréer les fin de ligne sous c++, puisqu'il ya un equivalent en c qui est le fscanf '\n', car windows gére automatiquement la fin de fichier, mais sous LINUX je reçois un SEGMENTATION FAULT, et mes camarade de classe m'ont conseillé de gerer les fin de lignes. donc comment le faire sous c++.

    fichier test contient:
    -----------------------
    Departement;3;4
    Paris;200
    Montpellier;56
    -------------------------
    PetN[0]=Departement
    PetN[1]=3
    PetN[2]=4
    dep[0]="Paris"
    dep[1]="Montpellier"
    Voix[0]=200
    voix[1]=56
    ------------------------
    et ma solution token prend tout à la fois jusqu'au separateur ";", par contre mes camarade lisent caractere par caractere.

    Merciii.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    C'est ton code qui est incomplet, ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	    // On récupere la ligne courante du fichier
    		fgets(ligne,100,m_File);
    Où est déclaré « ligne » ? Est-il dimensionné suffisamment large ?

    Où est déclaré « PetN » ? Est-il dimensionné suffisamment large ?

    Où est déclaré « dept » ? Mêmes remarques.
    En plus, « token » est un pointeur sur une chaîne de caractères, pas une chaîne en lui-même, type qui n'existe pas à proprement parler en C. Il faudra faire un strncpy() dans des buffers déclarés pour. Tu pourrais te contenter de conserver les pointeurs si tu étais sûr que les tokens retournés resteraient toujours à la même place. Mais strtok() ne le garantit pas et comme il y a des chances pour que cette fonction se contente d'aller remplacer le premier délimiteur qu'elle trouve par un '\0', tes lexons se font écraser à chaque fois que tu lis une nouvelle ligne.

    Où est déclaré « voix » ? ...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 318
    Par défaut
    Bonjour tt le monde,

    Je vous remercie tous pour vos réponse, j'ai résolu mon problème, car j'ai detecté qu'il y avait un problème de fin de fichier.
    au lieu de

    j'ai mis while(!feof(m_File)&&fgets(ligne,100,m_File))

    Merci.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par maserati Voir le message
    Je vous remercie tous pour vos réponse, j'ai résolu mon problème, car j'ai detecté qu'il y avait un problème de fin de fichier.
    <...>
    j'ai mis while(!feof(m_File)&&fgets(ligne,100,m_File))
    C'est faux. La bonne méthode est tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets (ligne, 100, m_File) != NULL)
    http://emmanuel-delahaye.developpez....s.htm#fichiers

Discussions similaires

  1. Debutant , gestion d'une file , segmentation fault
    Par Freedom57 dans le forum Débuter
    Réponses: 4
    Dernier message: 22/12/2010, 16h52
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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