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:
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
#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:
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.