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 dans un test de primalité


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Erreur : Segmentation Fault dans un test de primalité
    Voilà le code me permettant de verifier la primalité d'un nombre

    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
     
    #include <iostream>
    #include <vector>
    #include <string>
    #include <cstdlib>
    #include <cstdio>
    #include <ctime>
    #include <cmath>
     
    using namespace std;
     
    void Binary(int n, int& u, int& t)
    {
        int x(n - 1);
        int i(42);
        while (i==42)
        {if (x % 2 == 0)
        {x = x/2;
        t += 1;}
     
        else
        {u = x;
        i = 1;}
        }
        }
     
     
    bool Witness(int n,int a)
    {
        int u(0), t(0), x;
        int i(1);
        vector<int> valeurs(1, 0);
        Binary(n, u ,t);
        cout << a << "   " << t << endl;
        x = pow(a,t);
        cout << x << endl;
        valeurs[0] = x % n;
        cout << valeurs[0] << endl;
        for (i = 1; i <= u; i++)
        {
            int x(pow(valeurs[i-1],2));
            valeurs.push_back(x % n);
            if (valeurs[i] == 1 && valeurs [i-1] != 1 && valeurs[i-1] != n-1)
            {return true;}
            }
        if (valeurs[u] != 1)
        return true;
        else {return false;};
        }
     
    int main()
    {
        int n;
        int a;
    cout <<"entrez un entier impair et un nombre pour le tester";
    cin >> n;
    cin >> a;
    if (Witness(n, a) == true)
    {cout << "cet entier est premier";}
    else {cout << "try again";}
    }
    EDIT: simple inversion de variables, ainsi je faisait appel a une case inexistante.
    le code ci-dessus est correct quasiment quel que soit a. (exception faite des menteurs de Fermat)

  2. #2
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Une erreur de segmentation se produit quand tu touches à une zone mémoire à laquelle tu n'as pas accès. Typiquement, si tu as un pointeur nul, et que tu le déréférence sans vérifier, tu commenceras a faire des opérations sur la zone mémoire 0 qui peut par exemple appartenir à l'OS. l'OS te l'interdit et t'envoie chier en arretant ton programme et en te le signalant par une segfault.
    Une segfault peut arriver dans plusieurs cas :
    -opération sur un pointeur deleté
    -opération sur un pointeur non initialisé
    -récupération d'un élément d'une array au delà de la taille de l'array.
    -et encore pas mal d'autres cas

    La procédure pour vérifier la cause d'une segfault est l'utilisation d'un débugger. Il arretera l'execution du programme à l'endroit de la segfault, et te permettra d'explorer les valeurs de tes différentes variables à cet endroit. Normalement ca aide bien à comprendre le truc.
    Sous visual studio lance l'execution en mode débug, sous g++ il te faut le programme gdb en ayant compilé avec l'option -g.

    Dans ton cas, c'est surement un des nombreux accès à un élément de ton vecteur qui fait planter. Bizarre d'ailleurs je pensais que STL envoyait une exception dans ce genre de cas ?

  3. #3
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Quand ton post est résolu, tu effaces pas, tu expliques la solution que tu as trouvé et tu clic sur le bouton résolu en bas

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    La réponse était juste une faute stupide de ma part ^^ Merci tout de meme

  5. #5
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Ca m'intéresse quand même de savoir quelle faute

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Inversion de variables (je demandais au programme de checker la case numero t de mon programme alors qu'il me fallais la u, du coup la case n'existait pas, t étant plus grand)

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

Discussions similaires

  1. Erreur (segmentation fault) dans une fonction
    Par med1001 dans le forum C
    Réponses: 2
    Dernier message: 16/04/2012, 09h47
  2. [PostgreSQL] SQL DB_query Segmentation fault dans code PHP
    Par diabli73 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/11/2008, 12h59
  3. 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
  4. Réponses: 2
    Dernier message: 08/04/2007, 17h23
  5. [erreur] Segmentation fault
    Par fveysseire dans le forum C
    Réponses: 11
    Dernier message: 15/06/2006, 14h44

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