Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

c++:erreur de segmentation!



  1. #1
    ame1560

    c++:erreur de segmentation!


    ------

    salut;
    je suis débutante en c++, je travaille avec "dev-c++ 4.9.9.2" .
    mon probleme est que lors de la compilation tout est parfait..si j'execute le pgm sa bloque ,j'ai fait l'execution pas à pas :il me dit que le programme a renconter une erreur de segmentation...

    merci d'avance pour votre orientation...

    -----

  2. Publicité
  3. #2
    Gwyddon

    Re : c++:erreur de segmentation!

    Aie aie aie... Une erreur de segmentation ça peut vouloir dire tout et n'importe quoi malheureusement

    Si tu nous postait le code ici et que tu nous disait le but du programme, pour que l'on puisse en discuter ?
    A quitté FuturaSciences. Merci de ne PAS me contacter par MP.

  4. #3
    ame1560

    Re : c++:erreur de segmentation!

    je m'exuxe;
    voici le code:
    Code:
    #include<stdio.h>
    // la fonction permutation
    void echanger(int tableau[], const int i, const int j)
    {
       int temporaire;
       temporaire = tableau[i];
       tableau[i] = tableau[j];
       tableau[j] = temporaire;
    }
    //le tri à bulles 
    void triABulle(int tableau[], int longueur)
    {
       int i;
       bool permutation;
    
       do
       {
          permutation = false;
          for(i=0; i<longueur-1; i++)
          {
             if(tableau[i]>tableau[i+1])
             {
                echanger(tableau, i, i+1);
                permutation = true;
             }
          }
          longueur--;
       }
       while(permutation);
    }
    // le tri par inserstion
    void triParinsertion(int tableau[], int longueur)
    {
       int i, memoire, // memoire:valeur en cours de traitement
           compteur; // indique la partie du tableau à traiter
       bool marqueur; // faut-il continuer les comparaisons?
    
       for(i=1; i<longueur; i++)
       {
          memoire = tableau[i];
          compteur = i-1;
          do
          {
             marqueur = false;
             // comparaisons et décalages vers la droite si nécessaire
             if(tableau[compteur] > memoire)
             {
                tableau[compteur+1] = tableau[compteur];
                compteur--;
                marqueur = true;
             }
             if(compteur < 0) // on évite de dépasser les limites
                marqueur = false;
          }
          while(marqueur);
       } 
       tableau[compteur+1] = memoire;
       // on a classé le tableau jusqu'à l'indice i
    }
    // le tri par selection
    void triSelection(int tableau[], int longueur)
    {
       int i, maximum;
       while(longueur>0)
       {
          // recherche de la plus grande valeur du tableau
          maximum = 0;
          for(i=1; i<longueur; i++)
             if(tableau[i]>tableau[maximum])
                maximum = i;
          // echange du maximum avec le dernier élément 
          echanger(tableau, maximum, longueur-1);
          // on traite le reste du tableau
          longueur--;
       }
    } 
    // debut 
        int main()
        {
            int reponse,n,i,t[100];
            printf("donnez la dimension de votre tableau");
            scanf("%d",n);
            printf("donnez les valeurs du tableau une par une séparées à chaque fois par la touche entrer");
            for(i=0;i<n;i++)
            scanf("%d",&t[i]);
        
            printf("veuillez faire un choix dans le menu suivant:\n1*tri par selection\n2*tri par bulles\n3*tri par inserstion\n4*tri indirect\n");
           scanf("%d",&reponse);
           switch (reponse) 
           {
            case 1:triSelection(t,n);
            case 2:triABulle(t,n) ;
            case 3:triParinsertion(t,n);
            default : break;
                                  }
            }
    le but et de trier le tableau par differentes methodes..
    merci.

  5. #4
    Gwyddon

    Re : c++:erreur de segmentation!

    Salut,

    Là il faut que je parte désolé (je regarderai ça plus au calme ce soir) mais je peux déjà te donner une indication : as-tu vérifié que tu ne dépassais pas dans les boucles la longueur du tableau que tu balances à ta fonction ? C'est une source très fréquente de segmentation fault
    A quitté FuturaSciences. Merci de ne PAS me contacter par MP.

  6. A voir en vidéo sur Futura
  7. #5
    Coincoin

    Re : c++:erreur de segmentation!

    Salut,
    Comme l'a dit Gwyddon, une segmentation fault ça arrive quand tu fais des débordements de tableau (tu essayes alors d'écrire à un mauvais endroit de la mémoire). Le mieux, c'est de reprendre ton code en te demandant pour chaque tableau comment varie l'indice, en vérifiant toutes tes boucles (une inégalité large et non stricte par exemple), ...
    Si tu ne trouves pas, on se plongera dans ton code.
    Encore une victoire de Canard !

  8. #6
    danyvio

    Re : c++:erreur de segmentation!

    Dans quel moment précis le programme se plante t-il ? A l'initialisation des valeurs ? A l'exécution et alors de quelle sorte de tri ?
    On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !

  9. Publicité
  10. #7
    invite79115743

    Re : c++:erreur de segmentation!

    int reponse,n,i,t[100];
    printf("donnez la dimension de votre tableau");
    scanf("%d",n);
    Voila l'origine de ton segfault : scanf doit prendre en argument un format string, et des pointeurs vers les différents paramètres qui seront lus sur l'entrée.
    En l'occurence ici, n n'est pas un pointeur vers un entier, mais un entier ce qui engendre un access violation lors de l'execution du code (tu as pourtant bien utilisé scanf lors des autres appels)

    Ce code n'est de toute facon pas tres clair : tu alloues une taille statique pour ton tableau de 100 entiers, puis tu demandes a l'utilisateur d'entrer la taille.
    Si l'utilisateur tapes un chiffre > 100, c'est le buffer overflow assuré car tu dépasseras les les limites de ton tableau en memoire.
    Si tu veux vraiment utiliser une taille de tableau dynamique, utilise l'opérateur new de C++.

    Sinon l'usage de stdio.h est a proscrire en C++, il existe encore par souci de compatibilité avec le C.
    En utilisant <iostream>, tu n'aurais plus de probleme de ce genre.
    Un simple :
    std::cin >> n;
    suffirait
    Some of those tha wear forces, are the same that burn crosses.

Discussions similaires

  1. Erreur 40
    Par ciril34 dans le forum Dépannage
    Réponses: 0
    Dernier message: 24/09/2007, 13h30
  2. erreur 4
    Par thedoc dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 07/02/2007, 19h11
  3. J'ai un problème avec un segmentation fault
    Par gatsu dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 30/01/2007, 08h08
  4. erreur 414 et erreur 1055
    Par primera13 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 03/02/2006, 11h26
Découvrez nos comparatifs produits sur l'informatique et les technologies.