1

C++バッファをpython::boost :: listに変換しようとしていますが、C++クラスは次のとおりです。

#include "boost/python/list.hpp"

using namespace boost::python;

class Buffer {
public:
    unsigned char* m_pBuff;
    int m_iWidth;
    int m_iHeight;


    Buffer( cont int p_iWidth, const int p_iHeight ) {
        m_pBuff = new unsigned char[p_iWidth * p_iHeight];

        m_iWidth  = p_iWidth;
        m_iHeight = p_iHeight;
    }

    ~Buffer() { delete[] m_pBuff; }

    /* Class Functions */

    list getList ( void ) {
        list l;
        l.append(m_iWidth);
        l.append(m_iHeight);

        std::string data(m_iWidth * m_iHeight, ' ');

        unsigned char* pBuff = m_pBuff;
        for ( int i = 0; i < m_iWidth * m_iHeight; ++i, ++pBuff ) {
            data[i] = (char*) *pBuff;
        }

        l.append(data);

        return l;
    }
};

そして、Pythonブーストモジュールは次のように定義されています。

using namespace boost::python;

BOOST_PYTHON_MODULE(BufferMethods)
{

    class_<Buffer>("Buffer", init<const int, const int>()) 
        .add_property("width", &Buffer::m_iWidth)
        .add_property("height", &Buffer::m_iHeight)
        /* Other functions */
        .def("getList", &Buffer::getList)
    ;
}

しかし、Pythonでモジュールを実行すると、次のエラーが返されます。

>>> from BufferMethods import *
>>> Buff = Buffer(800, 600)
>>> dataList = Buff.getList()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 0: invalid continuation byte
>>>

私は何を間違っているのですか?私はPython3.3を使用しています。

4

2 に答える 2

1

項目をインスタンスに追加しようとすると、追加されたboost::python::list項目の python 型は、引数として指定された C++ オブジェクトの型から決定されます。あなたdataのタイプは であるためstd::string、この追加操作は Python 文字列を作成しようとしています。憶測: Python の文字列は何らかのレイアウトに従う必要があると思います。ランダムなデータを与えているだけなので、有効な文字列として解釈できません。そのため、UnicodeDecodeErrorが発生します。リストで何をするつもりなのか、バッファをPythonに公開する方法はわかりませんが、次のように動作するようです(の代わりにstd::vector<char>のタイプとして使用):datastd::string

#include <boost/python.hpp>
#include <boost/python/list.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <vector>

using namespace boost::python;

class Buffer {
public:
    unsigned char* m_pBuff;
    int m_iWidth;
    int m_iHeight;


    Buffer( const int p_iWidth, const int p_iHeight ) {
        m_pBuff = new unsigned char[p_iWidth * p_iHeight];

        m_iWidth  = p_iWidth;
        m_iHeight = p_iHeight;
    }

    ~Buffer() { delete[] m_pBuff; }

    /* Class Functions */

    list getList ( void ) {
        list l;
        l.append(m_iWidth);
        l.append(m_iHeight);

        std::vector<char> data(m_iWidth*m_iHeight);

        unsigned char* pBuff = m_pBuff;
        for ( int i = 0; i < m_iWidth * m_iHeight; ++i, ++pBuff ) {
            data[i] = (char) *pBuff;
        }

        l.append(data);

        return l;
    }
};

BOOST_PYTHON_MODULE(BufferMethods)
{

    class_<std::vector<char> >("CharVec")
            .def(vector_indexing_suite<std::vector<char> >());


    class_<Buffer>("Buffer", init<const int, const int>()) 
        .add_property("width", &Buffer::m_iWidth)
        .add_property("height", &Buffer::m_iHeight)
        /* Other functions */
        .def("getList", &Buffer::getList)
    ;
}

したがって、Python(3.2)では:

In [1]: from BufferMethods import *

In [2]: Buff = Buffer(800,600)

In [3]: dataList = Buff.getList()

In [4]: dataList[2]
Out[4]: <BufferMethods.CharVec at 0x18172d0>

In [5]: dataList[2][2]
Out[5]: '\x00'
于 2012-12-03T13:43:01.523 に答える
0

この問題はPython2.7を使用して解決されます...ここから非公式のビルドpython.boostを使用しているため、エラーが発生している可能性があります。

于 2012-12-03T14:06:12.410 に答える