Je souhaite utiliser la bibliothèque Giac pour effectuer du calcul matriciel (en commençant par la fonction padic_linsolve).
Je suis conscient que pour l'instant la documentation développeur n'est pas très fournie, et du coup je pense que mes problèmes peuvent en concerner d'autres (d'où mon post ici).
Je vais commencer par essayer d'expliquer le cheminement que j'ai suivi pour en arriver où je suis (c'est à dire, pas très loin...).
En cherchant dans le répertoire demo, je suis tombé sur pgcd.cc qui est un petit programme qui calcul l'intégrale d'une fonction (contrairement à son nom . Comme c'est un programme très simple qui marche - et que c'est apparemment le seul en c++ parmi les exemples -, je suis parti de celui ci pour essayer de faire un petit programme chargeant un système d'équations linéaires (sous forme matriciel bien évidemment) et appelant la fameuse fonction padic_linsolve qui se trouve dans vecteur.h
Premières interrogations : le type matrice est un alias de vecteur qui est lui même une sorte de std::vector<gen> où gen est un type générique qui peut être un int J'ai bien vu la présence de fonction makevecteur pour fabriquer un vecteur à partir de quelques valeurs, mais aucune fonction pour faire (ou charger) une matrice ?
Je pensais avoir compris que gen peut aussi être un vecteur, et que donc une matrice étant un vecteur de vecteur, il suffirait alors d'utiliser des makevecteur imbriqués ? Quid de la différence entre lignes et colonnes ? Par exemple, si je veux la matrice [[1,2],[3,4]], dois-je écrire makevecteur (makevecteur (1,2), makevecteur (3,4)) ou
makevecteur (makevecteur (1,3), makevecteur (2,4)) ?
Mais surtout, j'ai un problème à l'execution lorsque j'essaye d'utilise makevecteur ainsi :
Code : Tout sélectionner
% g++ -W -Wall -g test_padic_linsolve.cc -lgiac -lgmp
% ./a.out
*** glibc detected *** ./a.out: free(): invalid pointer: 0x08091000 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb6c37a85]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb6c3b4f0]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb6e02b11]
./a.out[0x8048e9b]
./a.out(_ZNSt12_Vector_baseIN4giac3genESaIS1_EE13_M_deallocateEPS1_j+0x27)[0x8048ec5]
/usr/lib/libgiac.so.0(_ZNSt6vectorIN4giac3genESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_+0x2d0)[0xb7215c5a]
/usr/lib/libgiac.so.0(_ZNSt6vectorIN4giac3genESaIS1_EE9push_backERKS1_+0x5e)[0xb7212106]
/usr/lib/libgiac.so.0(_ZN4giac11tab2vecteurEPNS_3genE+0x42)[0xb76bb2aa]
/usr/lib/libgiac.so.0[0xb77aa331]
/usr/lib/libgiac.so.0[0xb77ab339]
/usr/lib/libgiac.so.0[0xb7c4bb75]
/usr/lib/libgiac.so.0[0xb71cc2cd]
/lib/ld-linux.so.2[0xb7ef4990]
/lib/ld-linux.so.2[0xb7ef4ac3]
/lib/ld-linux.so.2[0xb7ee784f]
Dernières interrogations : Toutes les fonctions, ou presque, on un paramètre GIAC_CONTEXT. J'ai cru comprendre que c'était lié à l'utilisation multi-threads... comment fait-on pour appeler une telle fonction ? Y-a-t'il une valeur par défaut, genre :
Code : Tout sélectionner
#define GIAC_CONTEXT (int = 0)