OVH Cloud OVH Cloud

[boost/python] probleme de type

2 réponses
Avatar
Guillaume Desticourt
bonjour,

j'essaie d'ecrire un binding c++ python. mais j'ai un probleme de
conversion de type. le source est la:
http://www.freenopen.net/~guillaume/info/prog/source/pypointer-20050706-1428.tar.gz

Python 2.3.5 (#2, May 29 2005, 00:34:43)
[GCC 3.3.6 (Debian 1:3.3.6-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pypointer
>>> toto = pypointer.PyTest("toto")
>>> toto.printString()
toto
0
>>> toto.setString("tata")
0
>>> toto.printString()
tata
0

au dessus ca montre que ca marche un peu...

>>> titi = ""
>>> toto.getString(titi)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Boost.Python.ArgumentError: Python argument types in
PyTest.getString(PyTest, str)
did not match C++ signature:
getString(Test {lvalue}, char**)
>>>

je ne sais pas ou est le probleme de type, sur la conversion char** /
str? ou sur le PyTest / Test ?
tout aide est la bienvenue :)

merci d'avance,

--
Guillaume Desticourt

2 réponses

Avatar
Amaury
bonjour,

j'essaie d'ecrire un binding c++ python. mais j'ai un probleme de
conversion de type. le source est la:
http://www.freenopen.net/~guillaume/info/prog/source/pypointer-20050706-1428.tar.gz

...

titi = ""
toto.getString(titi)





Même sans rien connaître de Boost.Python, on voit qu'il y a un problème:
en python, une chaîne de caractères n'est pas modifiable ("mutable"), et
le passage de paramètres se fait par valeur et non par référence.
Il est donc exclu que getString puisse modifier la variable titi...

Il faudrait que tu puisses écrire quelque chose comme:
titi = toto.getString()




Regarde donc la doc de Boost pour savoir comment on transforme un
paramètre "out" en valeur de retour. (en tout cas, avec Swig, c'est facile).

Amaury.




Avatar
Guillaume Desticourt
Amaury wrote:



[...]

titi = ""
toto.getString(titi)






Même sans rien connaître de Boost.Python, on voit qu'il y a un problème:
en python, une chaîne de caractères n'est pas modifiable ("mutable"), et
le passage de paramètres se fait par valeur et non par référence.
Il est donc exclu que getString puisse modifier la variable titi...



k. je ne connais presque pas python donc...

Il faudrait que tu puisses écrire quelque chose comme:
titi = toto.getString()




Regarde donc la doc de Boost pour savoir comment on transforme un
paramètre "out" en valeur de retour. (en tout cas, avec Swig, c'est
facile).



apres recherche, j'ai cru comprendre qu'il fallait utiliser les tupple:
http://mail.python.org/pipermail/c++-sig/2005-June/009098.html
mais je n'ai pas reussi a adapter l'exemple a une methode, la doc de
boost etant ce qu'elle est :(

je me suis donc contente d'ecrire un petit wrapper pour prendre le
prototype que tu m'as suggere, ce n'est pas exactement ce que je
cherchais a faire, mais bon "ca marche".

merci,

--
Guillaume Desticourt