SFML のエラー ストリームをラップして、最後のエラー メッセージを Python 空間に取得しようとしています。
以下は、SFML がエラー ストリームであることを宣言する方法です (ソースを参照)。
namespace sf {
std::ostream& err();
}
SFML によると、上記のストリームをバッファにリダイレクトできます (この例ではファイルにリダイレクトされますが、最終的には文字列に変換したいと考えています)。
// Redirect to a file
std::ofstream file("sfml-log.txt");
std::streambuf* previous = sf::err().rdbuf(file.rdbuf());
いくつかの単純なラッパーを含む私の .pxd ファイル:
cdef extern from '<sstream>' namespace 'std' nogil:
cppclass stringbuf:
stringbuf() except +
cdef extern from '<iostream>' namespace 'std' nogil:
cppclass ostream:
stringbuf* rdbuf(stringbuf*)
cdef extern from 'SFML/System.hpp' namespace 'sf' nogil:
ostream cerr 'sf::err'
そして私の .pyx モジュール:
cdef void set_error_handler(stringbuf& buffer):
cerr.rdbuf(&buffer)
cdef object get_last_error():
error = error_buffer.str()
error_buffer.str('')
return error
cdef stringbuf error_buffer
set_error_handler(error_buffer)
またstringbuf
、関数内でエラー メッセージを Python 文字列に適切に変換していget_last_error()
ますか?
アップデート
Cython コードをコンパイルできました。ここに括弧を追加しました:
cdef extern from 'SFML/System.hpp' namespace 'sf' nogil:
ostream cerr 'sf::err()' # Added ()
stringbuf error_buffer
しかし、上記で定義された呼び出し時にSFML によって報告されたエラーを取得できませんget_last_error()
(戻り値は空の文字列です)。