0

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()(戻り値は空の​​文字列です)。

4

0 に答える 0