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 :

seg fault avec gmp


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut seg fault avec gmp
    alors voilà je suis nouvelle sur ce forum et j'ai une segfault que j'arrive pas à supprimer.
    je m'explique, je fais un projet pour lequel je dois manipuler de très grands nombres (ex : 230979485048261039076034528529086839797) j'utilise donc la librairie gmp.
    mon erreur est la suivante : j'ai un très grand entier (type mpz_t) que je dois convertir en binaire (dans mon cas, créer un tableau de 128 bits), ma fonction de conversion fonctionne parfaitement mais à la fin j'ai une segfault qui apparait alors que le résultat est correct (pour moi elle est là juste pour le fun ). j'ai donc utilisé gdb pour comprendre un peu mieux l'erreur et voilà le résultat :
    Program received signal SIGSEGV, Segmentation fault.
    0x001befa8 in ?? () from /lib/tls/i686/cmov/libc.so.6
    (gdb) up
    #1 0x001bf0cf in exit () from /lib/tls/i686/cmov/libc.so.6
    (gdb) up
    #2 0x001a6b5e in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
    (gdb) up
    #3 0x080489a1 in _start () at ../sysdeps/i386/elf/start.S:119
    119 ../sysdeps/i386/elf/start.S: Aucun fichier ou dossier de ce type.
    in ../sysdeps/i386/elf/start.S
    Current language: auto
    The current source language is "auto; currently asm".
    j'avoue que j'ai jamais compris grand chose à gdb, je l'utilise pour situer la ligne de code fautive mais là il m'aide pas du tout !

    voilà mon programme qui fait la conversion :
    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
     
    void gmp2bin(mpz_t n, int size, int* bin_tab){
            int i=size-1;
            mpz_t nb;
            mpz_init_set(nb,n);
     
            if(mpz_cmp_ui(nb,0)==0){
                    while(i>=0){
                            bin_tab[i] = 0;
                            i--;
                    }
            }
            else{
                    while(mpz_cmp_ui(nb,0)>0){
                           if(mpz_even_p(nb) == 0){
                                    bin_tab[i] = 1;
                                    mpz_sub_ui(nb,nb,1);
                                    mpz_divexact_ui(nb,nb,2);
                            }
                            else{
                                    bin_tab[i] = 0;
                                    mpz_divexact_ui(nb,nb,2);
                            }
                            i--;
                    }
                    while(i>=0){
                            bin_tab[i] = 0;
                            i--;
                    }
            }
    }
    voilà j'espère que j'ai été assez claire et que quelqu'un pourra me venir en aide !

    merci d'avance !

  2. #2
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Peux-tu préciser l'OS (linux?), le compilo (gcc?), sa version, les options de compilation et aussi la version de gdb ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    alors je suis sous ubuntu avec gcc version 4.4.1, avec comme options : -pg -g -Wall -W -pedantic -O0 et la version de gdb est la 7.0-ubuntu

    (merci j'avais pas pensé à préciser tout ça)

  4. #4
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    un SEG FAULT peut résulter (entre autre) d'un dépassement de borne dans un tableau.
    Comment est appelée la fonction gmp2bin et plus précisément, comment sont initialisés les paramètres size et bin_tab ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    alors voilà c'était vraiment juste pour tester donc c'est pas bien compliqué.
    comme ma fonction marchait malgré ma segfault j'ai continué en l'utilisant dans mon projet et là plus de segfault donc je pense que tu as raison, c'est au moment de la tester que je me plante.

    même si ça marche je veux bien que tu me dise ou j'ai fait l'erreur parce que je pense que je pourrais la refaire ailleurs...

    en tout cas merci de ton aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    mpz_t res;
    mpz_set_ui(res,17);
    int* tab = malloc(20*sizeof(int));
     
    gmp2bin(res,20,tab);
     
    for(j=0;j<20;j++) printf("%i",tab[j]);
    printf("\n");

  6. #6
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Je ne connais pas la librairie gmp donc je ne me prononcerais pas sur son utilisation (correcte ou non) .
    Pour le reste, je vois une seule chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                    while(mpz_cmp_ui(nb,0)>0){
                           if(mpz_even_p(nb) == 0){
                                    bin_tab[i] = 1;
                                    mpz_sub_ui(nb,nb,1);
                                    mpz_divexact_ui(nb,nb,2);
                            }
                            else{
                                    bin_tab[i] = 0;
                                    mpz_divexact_ui(nb,nb,2);
                            }
                            i--;
                    }
    Es-tu sure de sortir de cette boucle à temps ? cad avant que i < 0...

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/04/2006, 19h40
  2. [fclose] erreur de fermeture (seg fault)
    Par Goundy dans le forum C
    Réponses: 17
    Dernier message: 06/04/2006, 13h16
  3. Segmentation fault avec glCompressedTexImage2DARB
    Par patbier dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/12/2005, 10h32
  4. probleme de valeur retournée et seg fault
    Par florent_de_brest dans le forum C
    Réponses: 5
    Dernier message: 04/12/2005, 16h28
  5. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17

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