2011-09-19 18 views
2

私はクラスにPython反復プロトコルを実装してC++ライブラリを拡張しようとしています。問題は、next()メソッドからStopIteration例外を発生させようとすると、プログラムSegFaultが作成されることです。 http://www.swig.org/Doc1.3/Python.html#Python_nn44swig C++コードからStopIterationを呼び出す方法は?

このリストにはStopIteration例外がリストされていませんが、これは私が試したものですが、これは私が試したことです:

PyErr_SetString(PyExc_StopIteration, NULL); 

答えて

4

:私はちょうどあなたが役に立つかもしれない次のような優れたポスト、全体で来ている

PyErr_SetString(PyExc_StopIteration, "end of collection"); 

編集:以下の代わりにしてみてくださいPyObject *を返し、SetNoneも使用しなければなりません。したがって、次のようになります:

PyObject* next(PyObject* self) { 
    if (i < n) { 
     \\ go on iterating 
    } else { 
     PyErr_SetNone(PyExc_StopIteration); 
     return NULL; 
    } 
} 

リンクのためのaixのおかげで!

1

セグメンテーション違反はほぼ確実にあなたがPyErr_SetStringに渡してきたNULLポインタによって引き起こされます。だから、正しい答えは、次の()メソッドということのようですHow to create a generator/iterator with the Python C API?

+0

はい。これは、PythonインタプリタでStopIterationの例外として認識されていないようです。それはループをやめず、永遠に続くだけです。私はこれがエラーを起こすための正しいメカニズムではないかもしれないと思いますか?コードはstderrにそのメッセージを送信するようですが、Pythonの例外は発生しません。 – Oin

+0

@mapleoin:http://stackoverflow.com/questions/1815812/how-to-create-a-generator- iterator-with-the-python-c-api/1816961#1816961まだお持ちでない場合は、 – NPE

関連する問題