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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 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 expérimenté 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
    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 expérimenté 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
    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
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Par défaut
    La réponse était juste une faute stupide de ma part ^^ Merci tout de meme

  5. #5
    Membre expérimenté 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
    Par défaut
    Ca m'intéresse quand même de savoir quelle faute

  6. #6
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 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