Pergunta

Eu sou novo para C ++ / Python linguagem de programação mista e não têm muita idéia sobre Python / C API. Eu só comecei a usar Boost.Python para embrulhar uma biblioteca C ++ para Python. Eu estou preso em envolver uma função que leva ponteiro para uma matriz como um argumento. A seguir (2 ctor) é o seu protótipo em C ++.

class AAF{
  AAF(AAF_TYPE t);
  AAF(double v0, const double * t1, const unsigned * t2, unsigned T);
  ~AAF();
}

Estou fazendo direito por envolvê-lo como este em boost :: python?

class_<AAF>("AAF", init<AAF_TYPE>())
  .def(init<double, const double*, const unsigned*, unsigned>());

Note que compilado e ligado com sucesso, mas eu não conseguia descobrir como chamá-lo em Python. Minhas tentativas ingênuas como o seguinte falhou.

>>> z = AAF(10, [4, 5.5, 10], [1, 1, 2], 3);

Traceback (most recent call last):
  File "./test_interval.py", line 40, in <module>
    z = AAF(10, [4, 5.5, 10], [1, 1, 2], 3);
Boost.Python.ArgumentError: Python argument types in
    AAF.__init__(AAF, int, list, list, int)
did not match C++ signature:
    __init__(_object*, AAF_TYPE)
    __init__(_object*, double, double const*, unsigned int const*, unsigned int)

>>> t1 = array.array('d', [4, 5.5, 10])
>>> t2 = array.array('I', [1, 1, 2])
>>> z = AAF(10, t1, t2, 3);

Traceback (most recent call last):
  File "./test_interval.py", line 40, in <module>
    z = AAF(10, t1, t2, 3);
Boost.Python.ArgumentError: Python argument types in
    AAF.__init__(AAF, int, array.array, array.array, int)
did not match C++ signature:
    __init__(_object*, AAF_TYPE)
    __init__(_object*, double, double const*, unsigned int const*, unsigned int)

A minha segunda pergunta é que eu também preciso de envolver o destruidor? Por favor, especifique se isso pode ser necessário em alguns casos, mas nem sempre.

Foi útil?

Solução

A embalagem é certo (em princípio), mas na

AAF(10, [4, 5.5, 10], [1, 1, 2], 3);

(como os pontos de intérprete fora) você está passando à lista de objetos a função do Python, não ponteiros.

Em suma, se a sua função precisa apenas trabalho nas listas do Python você precisa alterar seu código para usar essa interface (em vez de usar ponteiros). Se você precisa manter essa interface, você tem que escrever uma função wrapper que leva uma lista de python, faz a conversão adequada e chama sua função original c ++. O mesmo se aplica a matrizes numpy.

Por favor, note que as ofertas boost :: python alguns built-in mecanismo para recipientes convertido python para recipientes compatíveis STL.

Um exemplo de código de embrulho para o seu caso poderia ser

void f(list o) {
    std::size_t n = len(o);
    double* tmp = new double[n];
    for (int i = 0; i < n; i++) {
        tmp[i] = extract<double>(o[i]);
    }
    std::cout << std::endl;
    // use tmp
    delete tmp;
}

Por favor dê uma olhada no tutorial boost.python em http://www.boost.org/doc/libs/1_39_0/libs/python/doc/tutorial/doc/html/index.html .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top