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 :

Problème Segmentation Fault


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Problème Segmentation Fault
    je dois faire un petit exercice où on demande de trier un tableau d'entier dans l'ordre croissant en utilisant une méthode "swap" qui prend comme argument 2 pointeurs sur des entiers pour les inverser. le problème c'est que directement après avoir initialiser mon tableau avec des entiers quelconques, le programme plante et affiche : Segmentation Fault
    je n'arrive pas à voir d'où vient le problème, donc si qqu'un peut m'aider c'est sympa. j'ai joint mon code et j'ai indiqué où ça plante exactement!(je vous l'ai mis aussi ci-dessous, c'est pas très lisible mais bon il est très court)

    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
    #include <stdio.h>
    #define NEL 10
    void swap(int* a, int* b);
     
    int main() {
     
       int tab[NEL];
           int i = 0;
           int j = 0;
     
           printf("entrer les 10 valeurs à trier : \n");
           for (i = 0; i < NEL; ++i) {
                  scanf("%d", &tab[i]);
           }
       /*erreur après la boucle ci-dessus quand j'entre la 10ième valeur : segmentation fault*/
     
       printf("ce message ne s'affiche pas, le programme plante avant");
     
           for (i = 0; i < NEL-1; ++i) {
                  for (j = i+1; i < NEL; ++j) {
                         if (tab[i] > tab[j]) {
                                swap(&tab[i], &tab[j]);
                         }
                  }
           }
     
       for (i = 0; i < NEL; ++i) {
                  printf("%d ", tab[i]);
           }
    }
     
    void swap(int* a, int* b) {
           int temp = 0;
           temp = *a;
           *a = *b;
           *b = temp;
    }
    Fichiers attachés Fichiers attachés
    • Type de fichier : c tri.c (654 octets, 42 affichages)

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    1. C'est CODE et non QUOTE qu'il faut utiliser
    2. Rajoute un \n à la fin du printf(), pour être sûr qu'il n'est VRAIMENT pas affiché.

    L'erreur semble être dans tes boucles imbriquées: Ta boucle sur j compare i à NEL...

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Attention, je rappelles que printf utilise un buffer et l'affichage ne se fait pas forcement quand tu utilises l'instruction (desole pour les accents, je suis sur un qwerty).

    Tu as trois possiblites pour ca :
    - Utiliser le flux standard d'erreur fprintf(stderr, "machin"); Le flux stderr n'est pas bufferise et l'affichage se fait directement
    - Ajouter \n pour vider le buffer
    - faire un fflush pour forcer le vidage

    Sinon, regarde ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (i = 0; i < NEL-1; ++i) {
    for (j = i+1; i < NEL; ++j) {
    Tu es sur de ton i< NEL dans la deuxieme boucle for ? A priori, ton j va s'incrementer a l'infini

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 6
    Points
    6
    Par défaut c'est ok
    oui ok merci! c'est corrigé,ça s'exécute! bonne journée

  5. #5
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par marcix
    oui ok merci! c'est corrigé,ça s'exécute! bonne journée
    N'oublie pas le bouton

Discussions similaires

  1. problème segment fault sur Linux
    Par kerido dans le forum Bibliothèques, systèmes et outils
    Réponses: 2
    Dernier message: 09/07/2013, 11h36
  2. Probléme "Segmentation Fault"
    Par LittleLiar dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 28/05/2011, 23h46
  3. Problème : pas de segmentation fault ?!
    Par Loïc B. dans le forum C++
    Réponses: 3
    Dernier message: 05/11/2007, 17h08
  4. Réponses: 6
    Dernier message: 01/11/2007, 18h44
  5. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50

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