Page 1 sur 1

mingw et pari

Publié : mer. août 02, 2017 3:52 pm
par frederic han
Salut,
j'essaye de compiler giac avec

Code : Tout sélectionner

./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32
sans pari ca marche (modulo quelques problemes avec tms et times virés dans icas.cc:

Code : Tout sélectionner

--- /home/fred/tmp/giac-1.2.3/src/icas.cc	2017-06-27 20:22:06.000000000 +0200
+++ giac-1.2.3/src/icas.cc	2017-08-02 13:08:22.837183739 +0200
@@ -1501,7 +1501,7 @@
   }
 #ifdef HAVE_LIBREADLINE
   if (ARGC==1){
-    struct tms start, end;  
+    //fred struct tms start, end;  
     using_history();
     cout << "Welcome to giac readline interface" << endl;
     cout << "(c) 2001,2016 B. Parisse & others" << endl;
@@ -1561,12 +1561,12 @@
 #ifdef __APPLE__
       unsigned startc=clock();
 #endif
-      times(&start);
+      //times(&start);
       xcas::icas_eval(gq,ge,reading_file,filename,contextptr);
 #ifdef __APPLE_
       startc=clock()-startc;
 #endif
-      times(&end);
+      //times(&end);
       giac::history_in(contextptr).push_back(gq);
       giac::history_out(contextptr).push_back(ge);
       // 2-d plot?
@@ -1592,7 +1592,7 @@
 #ifdef __APPLE__
 	cerr << "// dclock1 " << double(startc)/CLOCKS_PER_SEC << endl;
 #endif
-	cerr << "// Time " << giac::delta_tms(start,end) << endl;
+	//cerr << "// Time " << giac::delta_tms(start,end) << endl;
       }
 #ifdef HAVE_EQASCII
       struct Tgraph *graph=(Tgraph *)malloc(sizeof(struct Tgraph));
@@ -1665,8 +1665,8 @@
   gettimeofday(&tt,0);
   giac::gen et((int) tt.tv_sec);
   string st(et.print(contextptr));
-  struct tms start, end,f1,f2;  
-  times(&start);
+  //struct tms start, end,f1,f2;  
+  //times(&start);
   f2=start;
 #endif
   //xcas_mode(contextptr)=1;
en revanche avec pari j'ai une confusion:

Code : Tout sélectionner

pari.cc: In function 'long int* giac::mat2GEN(const giac::gen&, const vecteur&, const giac::context*)':
pari.cc:490:28: error: cannot convert 'GEN {aka long long int*}' to 'giac::GEN {aka long int*}' in initialization
     GEN res=cgetg(n+1,t_MAT);

Re: mingw et pari

Publié : mer. août 02, 2017 4:49 pm
par parisse
bizarre, essaie de remplacer GEN par long long int *?

Re: mingw et pari

Publié : sam. août 05, 2017 8:10 am
par frederic han
En fait la confusion vient du fait que dans pari: parigen.h contient un

Code : Tout sélectionner

#ifdef _WIN64
...
#define long long long
ce qui crée des confusions dans giac selon que l'on est avant (comme dans giac/pari.h) ou apres comme dans giac/pari.cc

J'ai l'impression d'avoir reussi à avoir un icas avec pari avec les corrections brutales suivantes:

(Je n'ai pas essayé de mettre un #define long long long dans pari.h)
1) dans pari.h j'ai remplacé les long par long long lignes 11 et 32
2) dans pari.cc j'ai mis des () autour de long lignes 201 et 205

Re: mingw et pari

Publié : sam. août 05, 2017 11:20 am
par parisse
Et si tu deplaces

Code : Tout sélectionner

typedef long * GEN;
avant le namespace, ca change quelque chose? (ce serait plus logique)

Re: mingw et pari

Publié : dim. août 27, 2017 9:13 pm
par frederic han
au fait,
non ca ne changeait rien car dans pari cette definition de long est placee avant la definition des GEN du coup la tienne ne deviens plus la meme que dans pari.

Re: mingw et pari

Publié : mar. août 29, 2017 4:36 pm
par frederic han
Bon ca compile, mais il y a des problemes d'interface entre pari et giac que je n'ai aps en 32bits:
(donc toujours pour la version 64bits windows) j'ai:

Code : Tout sélectionner

pari()
pari(2^64) // donne 1

Re: mingw et pari

Publié : mar. août 29, 2017 8:06 pm
par parisse
essaie de rajouter un !defined qui correspond a ta config a la ligne 143 de pari.cc

Re: mingw et pari

Publié : mer. août 30, 2017 12:01 am
par frederic han
En fait avec x86_64-w64-mingw32-gcc (gcc 6.3) j'ai à la fois WIN32 et WIN64 qui sont definis.
donc a la ligne 143 j'ai mis:

Code : Tout sélectionner

#if !defined(__APPLE__) && !defined(WIN32) || defined(WIN64)
ce qui améliore bien la situation pour pari(2^64).

En revanche il me reste ce soucis:

Code : Tout sélectionner

B:=matrix[[1,58,1387,17715,131260,578697,1538013,2648041,3687447,4993299,5858116,5979221,5239798,4098561,3176188,1660466,705432]];
B*transpose(B);
donne sous win64

Code : Tout sélectionner

matrix[[33788930686]]
au lieu de
matrix[[175925584603774]] sous linux

Re: mingw et pari

Publié : mer. août 30, 2017 6:33 am
par parisse
La, je ne vois rien d'evident, il faudrait debugguer.

Re: mingw et pari

Publié : mer. août 30, 2017 8:45 am
par frederic han
En fait le problème vient du produit de matrice sous win64:

Code : Tout sélectionner

v:=[1,58,1387,17715,131260,578697,1538013,2648041,3687447,4993299,5858116,5979221,5239798,4098561,3176188,1660466,705432];
v*v; // OK
v*transpose([v]); // OK
[v]*transpose([v]); // Faux
du coup j'ai essayé cela dans mmult_int (ligne 4346 de vecteur.cc)

Code : Tout sélectionner

#if defined(x86_64) && !defined(WIN64) //fred
		if (x>=0)
		  mpz_add_ui(*tmp._ZINTptr,*tmp._ZINTptr,x);
		else
		  mpz_sub_ui(*tmp._ZINTptr,*tmp._ZINTptr,-x);
#else
		tmp += gen(x);
		tmp.uncoerce();
#endif
et ca regle les problèmes! je vais regarder si je n'ai pas unproblème de mélange de plusieurs libgmp.

Edit: bon ca n'a pas l'air d'etre un mélange de libgmp, sans cette modification le probème persiste même avec --disable-pari

Re: mingw et pari

Publié : mer. août 30, 2017 9:06 am
par parisse
Ok, j'incorpore ta modif.