probleme compilation. Besoin de documentation

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

Modérateur : xcasadmin

joaopa
Messages : 44
Inscription : dim. sept. 14, 2014 10:18 pm

probleme compilation. Besoin de documentation

Message par joaopa » mar. sept. 16, 2014 9:02 am

Bonjour,
j'ai voulu compiler l'exemple fourni sur le site de xcas
http://www.google.fr/url?sa=t&rct=j&q=& ... 7201,d.cGU

Code : Tout sélectionner

#include <giac/giac.h>

using namespace std;
using namespace giac;

int main(){
  cout << "Tapez une fonction a integrer et une variable ";
  gen a,b;
  cin >> a >> b;
  cout << "La primitive est " << integrate(a,b,0) << endl;
  return 0;
}
Malheureusement cela ne compile pas
^
david@Carlitz:~$ g++ -g test.c -lgiac -lgmp
test.c: In function ‘int main()’:
test.c:10:49: error: invalid initialization of reference of type ‘const modpoly& {aka const giac::dbgprint_vector<giac::gen>&}’ from expression of type ‘giac::gen’
cout << "La primitive est " << integrate(a,b,0) << endl;
^
In file included from /usr/include/giac/giac.h:12:0,
from test.c:1:
/usr/include/giac/modpoly.h:159:11: error: in passing argument 1 of ‘giac::modpoly giac::integrate(const modpoly&, const giac::gen&)’
modpoly integrate(const modpoly & p,const gen & shift_coeff);



Peut-on avoir une document complète sur giac en utilisation avec C++?
Je n'ai pas trouvé sur le site de xcas

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: probleme compilation. Besoin de documentation

Message par frederic han » mar. sept. 16, 2014 1:11 pm

Bonjour et bienvenu,
pour la doc il y en a un peu avec:

Code : Tout sélectionner

info giac
je ne sais pas si bernard en a ecrit plus, mais je pioche souvent dans les sources ou les headers.

Souvent je cherche comme cela. typiquement vous voulez une fonction analogue a celle existant sous xcas, donc je cherche d'abord le mot clef xcas precede d'un underscore.
bien souvent on trouve des fonctions comme cela.

Code : Tout sélectionner

gen _integrate(const gen & args,GIAC_CONTEXT);

Code : Tout sélectionner

#include <giac/giac.h>

using namespace std;
using namespace giac;

int main(){
  cout << "Tapez une fonction a integrer et une variable ";
  gen a,b;
  cin >> a ;
  cout << "La primitive est " << _integrate(a,0) << endl;
  return 0;
}
qui donne:

Code : Tout sélectionner

macbookito(fred)$ g++ tutu.cpp -lgiac -llapack -lmpfr -lgmp 
macbookito(fred)$ ./
Display all 192 possibilities? (y or n)
macbookito(fred)$ ./a.out 
Tapez une fonction a integrer et une variable sin(x) 
La primitive est -cos(x)
macbookito(fred)$ ./a.out 
Tapez une fonction a integrer et une variable sin(x),x=0..pi/2
La primitive est 1

joaopa
Messages : 44
Inscription : dim. sept. 14, 2014 10:18 pm

Re: probleme compilation. Besoin de documentation

Message par joaopa » mar. sept. 16, 2014 5:51 pm

Merci, il y a du progrès. Mais je retombe sur un autre problème:

Code : Tout sélectionner

#include <giac/giac.h>
#include <iomanip> 

using namespace std;
using namespace giac;

int main(){
     gen e;
     e= _normal_icdf(0.95,0);
      cout << fixed << setprecision(2)<<  e._DOUBLE_val  <<endl;
  return 0;
}
compile et fonction. YESSSSSSSSSSSS!


Malheureusement celui-ci non (il compile mais segfaulte à l'execution)

Code : Tout sélectionner

#include <giac/giac.h>
#include <iomanip> 

using namespace std;
using namespace giac;

int main(){
     gen e;
     e= _normal_icdf(0,1,0.95,0);
      cout << fixed << setprecision(2)<<  e._DOUBLE_val  <<endl;
  return 0;
}
C'est bizarre car avec giac en mode console, il n'y a pas de problème pour calculer normal_icdf(0,1,0.95,0)

Une petite idée du pourquoi du comment?
Merci d'avance

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

Re: probleme compilation. Besoin de documentation

Message par parisse » mar. sept. 16, 2014 7:21 pm

Le code ne devrait pas compiler, il faudrait écrire _normal_icdf(makesequence(0,1,0.95),0)
Je conseille de créer une variable de contexte
giac::context ct;
et de passer l'adresse de ct au lieu de 0 en dernier argument
_normal_icdf(makesequence(0,1,0.95),&ct)
Sinon ce n'est pas très prudent d'utiliser e._DOUBLE_val sans avoir testé auparavant if (e.type==_DOUBLE_)
Et pour l'intégrale, ce serait _integrate(makesequence(a,b),&ct) ou integrate_gen(a,b,&ct) (désolé, la fonction integrate a été renommée en integrate_gen pour éviter les confusions avec les surcharges, mais je n'ai pas mis à jour la doc...)

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: probleme compilation. Besoin de documentation

Message par frederic han » mar. sept. 16, 2014 7:25 pm

C'est parce que ces fonctions n'attendent qu'un seul gen. Ex sous xcas tu pourrais faire:

Code : Tout sélectionner

g:=0,1,0.95
donc la tu dois creer 1 gen qui vaut cette sequence, il y a une instruction makesequence.

Tu peux aussi rajouter un context (1 par session) plutot que d'utiliser 0, c'est l'analogue d'une session sous xcas, cela stocke par exemple tes reglages (l'analogue du menu config)

Code : Tout sélectionner

int main(){
     context ct;

     gen g=makesequence(0,1,0.95);
     gen e;

     e= _normal_icdf(g,&ct);
     cout << fixed << setprecision(2)<<  e._DOUBLE_val  <<endl;
     cout <<  g.print(&ct)  <<endl;
  return 0;
}


joaopa
Messages : 44
Inscription : dim. sept. 14, 2014 10:18 pm

Re: probleme compilation. Besoin de documentation

Message par joaopa » ven. sept. 19, 2014 11:55 am

Merci beaucoup, grâce à vos conseils, j'ai réussi à terminer mon programme.

Répondre