tuto C++ ou Delphi svp

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

Modérateur : xcasadmin

Répondre
bbd
Messages : 8
Inscription : mar. févr. 25, 2014 9:43 am

tuto C++ ou Delphi svp

Message par bbd » mar. févr. 25, 2014 10:12 am

Bonjour
j'aimerais utiliser la bibliothèque giac.dll avec delphi
pour manipuler des matrices.
quelqu'un peut il m'envoyer un tuto ou un exemple de base ? un exemple pourrait m'aider, même en C++
du style créer 2 matrices 2x2 d'éléments génériques Uij et Vij et calculer le produit UxV.
je peux accéder aux fonctions de la dll mais je ne sais pas comment les utiliser.
Merci

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

Re: tuto C++ ou Delphi svp

Message par parisse » mar. févr. 25, 2014 12:00 pm

Code : Tout sélectionner

// -*- compile-command: "g++ -g matr.cc -lgiac -lgmp" -*-
#include <giac/giac.h>

using namespace std;
using namespace giac;


int main(){
  matrice u(2),v(2);
  u[0]=makevecteur(1,2); // 1ere ligne
  u[1]=makevecteur(3,4); // 2eme ligne
  v=mtran(u); // transposee
  gen uv=ckmultmatvecteur(u,v);
  cout << uv << endl;
  return 0;
}
Si vous voulez recuperer une matrice w au lieu d'un gen uv, il faut faire w=*uv._VECTptr; apres avoir teste que uv.type==_VECT (pour etre bien sur...).

bbd
Messages : 8
Inscription : mar. févr. 25, 2014 9:43 am

Re: tuto C++ ou Delphi svp

Message par bbd » mar. févr. 25, 2014 12:54 pm

ok merci pour la réponse rapide.
Dans l'exemple, je pense que vous utilisez giac comme une unité externe avec la clause include.
Dans mon cas je dois importer la dll et les fonctions n'ont pas le même nom.
exemple : makevecteur n'existe pas, mais toute une série de fonctions :
makevecteur__4giacRCQ24giac3gen
makevecteur__4giacRCQ24giac3genN21
makevecteur__4giacRCQ24giac3genN31
makevecteur__4giacRCQ24giac3genN41
etc...
d'autre part j'imagine que je dois définir des types matrices compatibles.
"gen_uv" connais pas.
Je n'ai trouvé aucune doc qui me permette de m'en sortir avec ce niveau d'information. La doc Xcas ne parle pas de gen_uv.

j'ai lu le post de la personne qui a galéré comme moi en décryptant une demo (unique?) en C++. apparemment gen est un type générique. Mais bon, pour l'instant je n'arrive même pas à récupérer la fn makevecteur.

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

Re: tuto C++ ou Delphi svp

Message par parisse » mar. févr. 25, 2014 3:03 pm

C'est un probleme d'interfacage de langage a mon avis. Il faudrait utiliser un convertisseur genre SWIG pour exporter en Delphi les declarations de fonctions. Sinon il faut que vous decodiez les noms C++ des fonctions de la DLL pour determiner lequel correspond a makevecteur prenant 2 arguments de type gen.
giac::matrice c'est un type giac aussi, c'est un giac::vecteur de giac::gen.
D'un autre cote vous n'avez peut-etre pas besoin des types giac, ca depend ce que vous voulez faire. Si vos donnees ne sont pas trop grosses, vous pouvez peut-etre directement appeler l'evaluateur avec des chaines de caracteres en entree et des chaines de caracteres en sortie, et dans ce cas la fonction
const char * caseval(const char *s);
qui utilise des chaines C en entree et en sortie vous suffira. C'est elle qu'on utilise dans l'interface javascript de giac. L'appel au produit de matrice serait alors juste caseval("[[1,2],[3,4]]*tran([[1,2],[3,4]])"), autrement dit la commande Xcas entre " (que vous pouvez sans doute facilement generer en Delphi).

bbd
Messages : 8
Inscription : mar. févr. 25, 2014 9:43 am

Re: tuto C++ ou Delphi svp

Message par bbd » mar. févr. 25, 2014 3:41 pm

ok,
je pensais faire comme vous dites au début,
pb : quel est le nom de l'évaluateur dans la dll ?
avec dependency walker j'ai accès à la liste des fonctions implémentées dans la dll. Je ne trouve pas de fonction CASEVAL, donc me voila rendu au point de départ.
Vous n'êtes pas l'auteur de la bibliothèque giac.dll ?

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

Re: tuto C++ ou Delphi svp

Message par parisse » mar. févr. 25, 2014 5:37 pm

Si, mais je ne l'utilise pas giac autrement que comme une librairie C++, donc je n'ai jamais de questions de ce genre à me poser. En javascript, le nom d'export est _ZN4giac7casevalEPKc. Attention, c'est le nom d'export généré par emscripten qui utilise le compilo de llvm, il est sans doute différent de celui compilé par cygwin qui est dans la distribution de xcas sous windows, et probablement aussi de celui compilé par mingw qui est dans la distribution de javagiac pour windows.

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

Re: tuto C++ ou Delphi svp

Message par frederic han » mer. févr. 26, 2014 10:46 am

Bonjour,
je ne sais pas si ca peut vous aider, mais il y a un projet qui utiliser giac et delphi la:

https://sites.google.com/site/rackmath/home

http://codes-sources.commentcamarche.ne ... veau-lycee


Sinon ce qui n'etait pas clair pour moi au debut c'est que pour utiliser la librairie c++ giac depuis l'exterieur
(dans mon cas c'etait depuis cython)
les 2 classes gen et context suffisent pour tout faire.

le context permet d'effectuer les calculs dans un contexte voulu ( preferences, variables affectees ...)
(l'analogue d'un onglet pour xcas)

les gen pour tous les objets mathematiques, que l'on peut initialiser de differentes manieres. (dont string, entiers)

a+

Frederic

bbd
Messages : 8
Inscription : mar. févr. 25, 2014 9:43 am

Re: tuto C++ ou Delphi svp

Message par bbd » mer. févr. 26, 2014 2:27 pm

Merci Frédéric pour votre réponse.
Evidemment j'ai téléchargé l'application rackmath, que j'ai commencé à décortiquer. C'est la seule application delphi disponible sur le net utilisant giac.dll, elle est donc précieuse. Merci à celui qui l'a écrite.
Ca pourrait constituer un point de départ. Le problème (entre autres), c'est la correspondance entre les noms de routines exportées dans la dll et celles de la bibliothèque C++
si vous avez des démos python ça pourrait peut-être être utile.

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

Re: tuto C++ ou Delphi svp

Message par frederic han » mer. févr. 26, 2014 5:51 pm

Malheureusement pour giacpy et qcas je n'utilise pas giac.dll. J'utilise les headers c++ de giac et une librairie giac que j'ai compile avec mingw je n'ai donc pas votre probleme de noms non plus.

En revanche j'ai l'impression que rackmath a defini quelques fonctions c++ qui utilisent giac.h et ensuite les autres fichiers n'utilisent que ces fonctions nouvelles fonctions. (Je ne sais pas comment l'auteur de rackmath a recupere les noms des fonctions qu'il a cree)


Ceci dit j'ai l'impression que c'est au moment de creer la giac.dll qu'il y a peut etre un moyen de recuperer ces noms.

bernard dans ton fichier giac_oo.cpp je vois en commentaire:

Code : Tout sélectionner

// -*- compile-command: "g++ -Isrc -c giac_oo.cpp" -*-
// dlltool --export-all --output-def giac_oo.def giac_oo.o
// dllwrap giac_oo.o --dllname giac_oo.dll --def giac_oo.def /bin/giac.dll -lstdc++ -lpthread -lintl -mwindows -lole32 -luuid -lcomctl32 -lwsock32
// lib /machine:i386 /def:giac_oo.def
est ce qu'au moment de creer la giac.dll tu pourrais aussi creer un ficher .def les informations cherchees y sont peut etre?

aussi, si vous ne trouvez pas la fonction caseval, elle est peut etre recente et donc absente de votre version de la giac.dll

Ex: dans une giac.dll de xcas recent j'ai l'impression que son nom est aussi cela:

Code : Tout sélectionner

_ZN4giac7casevalEPKc
Frederic

bbd
Messages : 8
Inscription : mar. févr. 25, 2014 9:43 am

Re: tuto C++ ou Delphi svp

Message par bbd » mer. févr. 26, 2014 8:25 pm

dans rackmath il importe directement les fonctions de la dll en les renommant.
exemple : @Giac_estcefactorisable:=GetProcAddress(Convert,'RPestcefactorisable__FPcT0');
encore faut-il savoir à quoi correspond la fonction RPestcefactorisable__FPcT0 dans ce cas précis.
peut-être qu'avec la liste des correspondances et les sources C++ ça serait plus clair, mais très franchement, pour ce qui me concerne je ne vais pas aller plus loin.

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

Re: tuto C++ ou Delphi svp

Message par frederic han » jeu. févr. 27, 2014 8:56 am

Bonjour,
ce qui m'avait frappé c'est que ces fonctions importées n'existent pas dans la version originelle de giac.
Il a crée lui meme toutes ces fonctions dans communes_giac.cc

Ca veut probablement juste dire qu'il a modifie en c++ le source de giac pour avoir les fonctions dont il avait besoin puis il s'est crée sa propre giac.dll
(mais je pense qu'a l'epoque de rackmath la fonction
const char * caseval(const char *s);
n'existait pas dans giac)

Bon, je suis conscient que ca ne vous aide pas beaucoup pour importer caseval

a bientot

Frederic

Répondre