1

Patricia Tries (Perl の NET::Patricia) をラップして Python で公開しようとしています。クラスの1つに問題があります。

そのため、Python から見たパトリシア ノード (以下) のインスタンスには、「データ」プロパティがあります。読み取りはうまくいきますが、書き込みは壊れます。

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の本で読んだことから、これはデータへのポインタを渡す必要があることを意味すると思います。によると:

また、生のポインター値を外部の python ライブラリーに渡す必要がある場合は、ポインター オブジェクトを整数にキャストすることでそれを行うことができます... ただし、逆の操作はできません。生の整数値からのポインター オブジェクト。

質問:

  1. 私はこれを正しく理解していますか?
  2. どうすればこれを回避できますか? %extends ですか? タイプマップ? 具体的にとても参考になります。

ノート:

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

3 に答える 3

1

PyObject*私はしばらく SWIG を使用していませんが、 a を受け取り、required にキャストしたり、void*その逆を行う typemap を使用したいと思うことは間違いありません。もちろん、参照カウントを追跡するようにしてください。

于 2009-08-26T20:58:55.633 に答える
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!

そして、あなたはPythonと同等のをやっているように私には思えますset(tree, value)。今、私はSWIGの専門家ではありませんが、整数の代わりにタプルを渡すことができるかもしれません。動作しますかN.data = (1,)これはAllegroCL+ SWIGの例で提案された答えでしたが、Pythonにどれだけうまく適用できるかはわかりません。

于 2009-03-23T19:25:06.283 に答える
0

別の方法は、同じ基本コードを使用 するPyRadixを使用することです。

于 2010-01-26T19:19:06.267 に答える