probleme pour copier un gen

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

rudi
Messages : 5
Inscription : jeu. juil. 06, 2006 8:03 pm

probleme pour copier un gen

Message par rudi » jeu. juil. 06, 2006 8:23 pm

J'ai un problème pour travailler sur une copie de gen sans modifier le gen de départ. Par exemple, soit g un gen de type Symbolic, je crèe une copie que je modifie ensuite:
giac gcopie(g);
gcopie._SYMBptr->feuille=g2; (ou g2 est un autre gen symbolic)
Dans ce cas, je modifie à la fois la copie mais aussi g.
Si je ne me trompe pas, cela vient du fait que g._SYMBptr->feuille et gcopie._SYMBptr->feuille ont la même adresse. De même pour g._SYMBptr->sommet et gcopie._SYMBptr->sommet.
Je ne connait pas grand chose au constructeur de copie, donc je suis un peu coincer. J'aimerais savoir comment creer des gen avec des pointeurs qui ne pointeraient pas sur les mêmes objets.
Merci

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » ven. juil. 07, 2006 6:23 am

bonjour,

pour creer une copie modifiable d'un symbolique, on peut faire comme suit:

// if (g.type==_SYMB)
gen gcopie=symbolic(g._SYMBptr->sommet, g._SYMBptr->feuille);

On peut alors modifier gcopie._SYMBptr->sommet ou feuille sans modifier g.
Ceci dit en general on cree rarement des symboliques de cette maniere, la plupart du temps on appelle une fonction, par exemple
gen gcopie = g._SYMBptr->sommet(g._SYMBptr->feuille);
La difference c'est que dans le 1er cas on n'evalue pas la fonction, dans le second on l'evalue.

Invité

Message par Invité » ven. juil. 07, 2006 6:12 pm

Merci pour votre aide.
J'ai essayer
gen g2=g._SYMBptr->sommet(g._SYMBptr->feuille);
mais le compilateur ne trouve pas la fonction à utiliser. J'ai donc utiliser la 1ère méthode :
gen g2=symbolic(g._SYMBptr->sommet, g._SYMBptr->feuille);
Ca a bien compilé, mais les modifications sur la copie g2 ont continué de perturber g, bien que les adresses des feuilles et des sommets soient distinctes. J'ai pensé que les adresses des feuilles de feuilles étaient rester les mêmes. J'ai écrit la fonction suivante :
gen copiedegen(const gen g){
gen g2;
if (g.type==_SYMB){return symbolic(g._SYMBptr->sommet, copiedegen(g._SYMBptr->feuille));}
else
if (g.type==_VECT){vecteur gvect;
int n=gvect.size();
vecteur gfin(n);
for (int i=0;i <=n-1;i++)
{gfin=copiedegen(g);}
return gfin;
}
else return g2=gen(g);}
Peut-être y-a-t-il des erreurs ou bien on peut surement l'améliorer. Tout ce que je peux dire c'est que le code a pu etre compilé, et mon problème s'est résolu.

rudi
Messages : 5
Inscription : jeu. juil. 06, 2006 8:03 pm

rectification

Message par rudi » sam. juil. 08, 2006 5:37 pm

Il y a une erreur dans le code de copiedegen de mon message précédent :
ce n'est pas
int n=gvect.size();
l'entier n étant alors toujours nul, mais bien
int n=g._VECTptr->size();

Merci

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » sam. juil. 08, 2006 5:55 pm

c'est normal, j'ai oublie de donner la variable de contexte
contextptr (vous pouvez la prendre a 0 si vous ne pensez pas travailler avec des threads)
gen g2=
g._SYMBptr->sommet(g._SYMBptr->feuille,contextptr);
Sinon pour creer une copie d'un vecteur vous pouvez ecrire
gen gcopie(*g._VECTptr,g.subtype);
cette syntaxe permet aussi de conserver la propriété de sous-type du vecteur (s'il represente un polynome par exemple)
Par contre ca n'effectue pas de clonage recursif des composantes du vecteur.

Répondre