2013-04-07 7 views
2

Я просто играю вокруг SWIG, чтобы создать модуль python для конкретной библиотеки C. У меня возникли проблемы с двойными и плавающими переменными. Вот пример:Модуль python, скомпилированный SWIG, возвращает неверный результат

/***** 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); 

И

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

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

Результат:

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

Любые идеи, почему это происходит?

P.S. Если я вызываю функцию из кода 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; 
} 

Все отлично:

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

добавить, что происходит с 'floatfun', когда вы запускаете только код C? не запускаемый python, вызывающий его из простой функции c c. –

+0

@StephaneRolland Спасибо за хороший вопрос. Я редактировал сообщение. – rth

ответ

2

Если добавить заголовок, как показано в the first example in the docs:

%{ 
#include "simple.h" 
%} 

, то вы должны получение:

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

См. full example.

+0

спасибо. Оно работает. Почему в документации SWIG ничего нет? Почему так происходит? – rth

+0

@rth: Я добавил ссылку на пример кода в документах. – jfs

Смежные вопросы