6

コールバック関数 (callback_function) を使用して、ラップしたい構造体 (glp_tree) へのポインターを提供する C ライブラリを使用しようとしています。

で作成されていないポインタでインスタンスを初期化する正しい方法は何__cinit__ですか? cython のドキュメントでこのパターンの例を見つけることができません。

ポインタを整数にキャストして戻す作業コード(以下を参照)がありますが、これが良い習慣/正気であるかどうかはわかりません。

cdef extern from "stdint.h":
    ctypedef unsigned long long uint64_t

cdef extern from "glpk.h":
    ctypedef struct glp_tree:
        pass

cdef void callback_func(glp_tree* tree, void *info):
    treeobj = Tree(<uint64_t>tree) // cast to an integer...

cdef class Tree:
    cdef glp_tree* ptr
    def __init__(self, uint64_t ptr):
        self.ptr = <glp_tree*>ptr // ... and back to a pointer

glp_tree オブジェクトを直接渡すとうまくいくようですが (私がやりたいことではありませんが)、ポインターを渡そうとするとコンパイラ エラーが発生します。

Cannot convert 'glp_tree *' to Python object
4

3 に答える 3

2

ポインターを整数にキャストすることはオプションですが、使用する正しい型はuintptr_t, notですuint64_t(これは自己文書化されており、常にプラットフォームに適した幅を持っています)。

問題は、出力Treeで明確にわかるように、 a の構築が Python 操作であることです。cython -aコンストラクターへの入力は Python データ構造に変換する必要があり、ポインターには明確な変換がありません。

于 2013-09-09T10:06:11.493 に答える
-1

これはうまくいきます

cdef class Tree:
    cdef glp_tree* ptr
    def __init__(self, long ptr):
        self.ptr = <glp_tree*>PyLong_AsVoidPtr(ptr)
于 2015-01-03T11:56:49.940 に答える