2012-06-13 4 views
0

J'essaie de changer la valeur de d qui est de type mpz_t dans la fonction extended_gcd, puis de la renvoyer à ma fonction principale et j'obtiens une erreur de segmentation lorsque j'exécute le programme.Fonction Le paramètre provoque une erreur de segmentation dans GMP

int extended_gcd(mpz_t c, mpz_t a, mpz_t b) 
    { 

     mpz_t x, lastx, y, lasty, temp, quotient, temp2; 

     mpz_init(temp); 
     mpz_init(temp2); 
     mpz_init(a); 
     mpz_init(b); 
     mpz_init(c); 
     mpz_init(quotient); 
     mpz_init_set_ui(x,0); 
     mpz_init_set_ui(lastx,1); 
     mpz_init_set_ui(lasty,0); 
     mpz_init_set_ui(y,1); 

while(!(mpz_cmp(b, 0)==0)) 
{ 
    mpz_set(temp, b); 
    mpz_cdiv_q(quotient, a, b); 
    mpz_mod(b, a, b); 
mpz_set(a, temp); 
    mpz_set(temp, x); 
mpz_mul(temp2, quotient, x); 
mpz_sub(x, lastx, temp2); 
    mpz_set(lastx, temp); 
    mpz_set(temp, y); 
    mpz_mul(temp2, quotient, y); 
mpz_sub(y, lasty, temp2); 
    mpz_set(lasty, temp);     
} 

mpz_set(c, lastx);   
mpz_clear(x); 
mpz_clear(y); 
mpz_clear(lastx); 
mpz_clear(lasty); 
mpz_clear(temp); 
mpz_clear(temp2); 
mpz_clear(quotient); 
return 0; 

}

Et voici le code dans mon principal:

extended_gcd(d,e,phi); 
    printf("d="); 
    mpz_out_str(stdout, 10, d); 
    printf("\n"); 

Toute idée de ce qui pourrait être mal et comment puis-je résoudre ce problème? Merci pour votre temps.

Répondre

1

Je vois un problème: vous ne devriez pas appeler mpz_init() sur les arguments de extended_gcd(). Vous devriez seulement appeler mpz_init()/mpz_clear() sur les variables mpz_t déclarées à l'intérieur de extended_gcd().

Questions connexes