2016-02-27 3 views
1

J'utilise la bibliothèque NTL C++. En essayant d'exécuter le code suivant:Bibliothèque NTL ref_GF2 Erreur d'exécution

NTL::ref_GF2 *zero = new NTL::ref_GF2(); 
NTL::ref_GF2 *one = new NTL::ref_GF2(); 
set(*one); 

Je reçois une erreur de EXC_BAD_INSTRUCTION:

ref_GF2 operator=(long a) 
{ 
    unsigned long rval = a & 1; 
    unsigned long lval = *_ref_GF2__ptr; 
    lval = (lval & ~(1UL << _ref_GF2__pos)) | (rval << _ref_GF2__pos); 
    *_ref_GF2__ptr = lval; 
    return *this; 
} 

Le problème semble provenir de l'ensemble (* une) ligne de code.

J'ai essayé de comprendre ce qui ne va pas dans le code, en vain. Toute aide appréciée.

Répondre

0

De l'documentation:

The header file for GF2 also declares the class ref_GF2 , which use used to represent non-const references to GF2 's, [...].

There are implicit conversions from ref_GF2 to const GF2 and from GF2& to ref_GF2 .

Vous obtenez l'erreur parce que vous êtes en train de définir une référence sans cible. Au point où vous appelez set(*one), *one ne pointe pas à un GF2 et donc il génère une erreur.

Il fonctionne très bien, si vous pointez sur un GF2 avant d'appeler set(*one):

NTL::GF2 x = GF2(); 
NTL::set(x);    // x = 1 

NTL::ref_GF2 *zero = new NTL::ref_GF2(x); 
NTL::ref_GF2 *one = new NTL::ref_GF2(x); 

// this works now 
NTL::clear(*zero); 
NTL::set(*one); 

cout << *zero << endl;  // prints "1" 
cout << *one << endl;  // prints "1" 

Notez que ref_GF2 représente une référence à un GF2. Mon code d'exemple montre que zéro et un tous les deux pointent vers x. Peut-être que vous voulez utiliser GF2 au lieu de ref_GF2.

+0

Hey, juste résolu cela aussi bien. Vous avez raison, j'ai dû utiliser GF2 au lieu de ref_GF2. Merci pour les commentaires! –