2009-03-23 9 views
1

私はPythonで公開されるPatricia Tries(PerlのNET :: Patricia)をラップしようとしています。私はクラスの1つで問題を抱えています。の問題パトリシアがSwigを使って試してみる、

したがって、pythonから見たpatriciaノード(下)には "data"プロパティがあります。それを読むことはうまくいくが、それを書くことは壊れる。具体的に

typedef struct _patricia_node_t { 
    u_int bit;   /* flag if this node used */ 
    prefix_t *prefix;  /* who we are in patricia tree */ 
    struct _patricia_node_t *l, *r; /* left and right children */ 
    struct _patricia_node_t *parent;/* may be used */ 
    void *data;   /* pointer to data */ 
    void *user1;   /* pointer to usr data (ex. route flap info) */ 
} patricia_node_t; 

>>> N = patricia.patricia_node_t() 
>>> assert N.data == None 
>>> N.data = 1 
TypeError: in method 'patricia_node_t_data_set', argument 2 of type 'void *' 

が今私のCが弱いです。私がSWIGの本で読んだことから、これはデータへのポインタを渡す必要があることを意味していると私は思う。 the bookによると:

また、あなたには、いくつかの外部のPythonライブラリに生のポインタ値を渡す必要がある場合、あなたは整数へのポインタオブジェクトをキャストすることによってそれを行うことができます...しかし、逆の操作を行うことはできませんつまり、生の整数値からSwigポインタオブジェクトを構築することはできません。

質問:

  1. 私はこれを正しく理解するのですか?
  2. どうすればこの問題を回避できますか? %は拡張ですか?タイプマップ?詳細は非常に役立つだろう。

注:

  1. 私はCのソースを変更することはできませんが、私は、追加の.hファイルまたは.iファイルインタフェースでそれを拡張することができます。
  2. 「データ」フィールドには、私が実際にはわからない「何か」の妥当な値の「何か」を含めることができるはずです。

答えて

0

SWIGに整数へのポインタを渡す必要があるようです。これは、すべてのCにあった場合たとえば、あなたのエラーは次のようになります:

void set(struct _patricia_node_t *tree, void *data) { 
    tree->data = data; 
} 

... 

int value = 1; 
set(tree, &value); // OK! HOORAY! 
set(tree, value); // NOT OK! FIRE SCORPIONS! 

そして、あなたがset(tree, value)のPythonの同等のものをやっている私には思えます。今私はSWIGの専門家ではありませんが、おそらく整数の代わりにタプルを渡すことができますか? N.data = (1,)は機能しますか?これは、Allegro CL + SWIGの例で示唆された答えでしたが、Pythonにどれだけうまく当てはまるかわかりません。

1

しばらく私はSWIGを使用していませんでしたが、PyObject*となるタイプマップを使用し、必要に応じてキャストするようにしてください。逆の場合も同様です。もちろん、参照カウントを記録しておいてください。

0

代わりに、同じ基本コードを使用するPyRadixという使用があります。

関連する問題