2011-12-23 11 views
7

Cythonを使用して独自のリストコンテナを作成したいと思います。私はそれに非常に新しいbegginerだし、私はこのような構造を作成することに得ることができるマニュアルを参照して、以下:CythonでC構造体を作成する

cdef struct s_intList: 
    int value 
    void* next 
ctypedef s_intList intList 

が、構造体のメンバをアクセスもする時間が来るとき、私は良いの構文を見つけることができません。

cpdef void foo(): 
    cdef intList* li 
    # li.value OR li->value 

はスロー: "警告:intlists.pyx:8:12:代入する前に、参照ローカル変数 '李'" 私は私のcythonの構造体の使い方が間違っていると仮定しましょう ...

任意のアイデアをここで私が間違ってやっているのはどうですか? :) ありがとうございました

+0

私は '' void 'をPython object'に変換できませんが、私はエラーがないと修正しました。あなたは古いCythonバージョンを持っているか、コードの関連する部分を表示していません。 –

答えて

9

intListのメモリを割り当てる必要があります。ローカル変数または のmallocを使用してください。あなたのコードで

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

cpdef object foo(): 
    cdef intList li 
    li.value = 10 
+0

ニース!私は 'オブジェクト'の戻り値の型が見当たりませんでした。これに関するすべてのドキュメントはどこですか? :-) ありがとうございました! – Oleiade

+0

また、「オブジェクト」を除外してください。少なくともCython 0.16では 'None'を返します。 –

4

liintListポインタです。このポインターは何かを指すように初期化されていないので、li.valueにアクセスすることは無意味です(誤っています)。

fabrizioMの回答では、intListがスタック上に作成されています(したがって、li.valueのために予約されたメモリ内の場所があります)。

intList実際のデータ(リンクされたリストデータ構造のようになります)を使用して作成する場合は、intListを関数などから返すことができるようにするには、ヒープ上にintList構造体を割り当て、そこから完全なリンクリストを構築します。 Cythonでは、malloc(とfree)と簡単にこれを呼び出すことができます。

関連する問題