Page 1 sur 1

probleme compilation. Besoin de documentation

Publié : mar. sept. 16, 2014 9:02 am
par joaopa
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

Re: probleme compilation. Besoin de documentation

Publié : mar. sept. 16, 2014 1:11 pm
par frederic han
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

Re: probleme compilation. Besoin de documentation

Publié : mar. sept. 16, 2014 5:51 pm
par joaopa
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

Re: probleme compilation. Besoin de documentation

Publié : mar. sept. 16, 2014 7:21 pm
par parisse
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...)

Re: probleme compilation. Besoin de documentation

Publié : mar. sept. 16, 2014 7:25 pm
par frederic han
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;
}


Re: probleme compilation. Besoin de documentation

Publié : ven. sept. 19, 2014 11:55 am
par joaopa
Merci beaucoup, grâce à vos conseils, j'ai réussi à terminer mon programme.