2013-04-07 3 views
2

Je ne fais que jouer SWIG pour créer un module python pour une bibliothèque C spécifique. J'ai eu le problème avec les variables double et float. Voici un exemple:Le module python compilé par SWIG renvoie un mauvais résultat

/***** simple.c *****/ 
#include <stdio.h> 
double doublefun(double b){ 
     printf("c(%g)",b); 
     return b+12.5; 
} 

float floatfun(float b){ 
     printf("c(%f)",b); 
     return b+12.5; 
} 

int intfun(int b){ 
     printf("c(%d)",b); 
     return b+12; 
} 

/***** simple.i *****/ 
%module simple 
%{ 
%} 

extern double doublefun(double); 
extern float floatfun(float); 
extern int intfun(int); 

ET

#***** simpletest.py *****# 
import simple 

print "i:",simple.intfun(2) 
print "f:",simple.floatfun(2.3) 
print "d:",simple.doublefun(2.3) 

Le résultat est:

i:c(2) 14 
f:c(36893488147419103232.000000) 30.0 
d:c(2.3) 6.0 

Toutes les idées pourquoi il arrive?

P.S. Si j'appeler des fonctions à partir du code C ....

int main(int argc, char** argv){ 
     printf("i::%d\n",intfun(2)); 
     printf("f::%f\n",floatfun(2.3)); 
     printf("d::%g\n",doublefun(2.3)); 
     return 0; 
} 

Tout va bien:

c(2)i::14 
c(2.300000)f::14.800000 
c(2.3)d::14.8 
+0

Ajoutez ce qui se passe avec 'floatfun' lorsque vous lancez le code C seul? pas lancé par python, l'appelant d'une simple fonction principale c. –

+0

@StephaneRolland Merci pour cette belle question. J'ai modifié le post. – rth

Répondre

2

Si vous ajoutez l'en-tête comme indiqué dans the first example in the docs:

%{ 
#include "simple.h" 
%} 

alors vous devriez obtenir:

i:c(2) 14 
f:c(2.300000) 14.8000001907 
d:c(2.3) 14.8 

Voir full example.

+0

merci. Ça marche. Pourquoi n'y a-t-il rien dans la documentation SWIG? Pourquoi ça arrive? – rth

+0

@rth: J'ai ajouté le lien vers l'exemple de code dans les docs. – jfs

Questions connexes