Domanda

Sono nuovo di C ++ / linguaggio di programmazione Python mista e non ho molto idea di Python / C API. Ho appena iniziato a utilizzare Boost.Python per avvolgere una libreria C ++ per Python. Sono bloccato in avvolgendo una funzione che prende puntatore ad un array come argomento. In seguito (2 ° ctor) è il suo prototipo in C ++.

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

Sto facendo proprio avvolgendolo come questo in boost :: python?

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

Si noti che compilato e collegato con successo, ma non riuscivo a capire come lo chiamano in Python. I miei tentativi ingenui come il seguente fallito.

>>> 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)

La mia seconda domanda è che cosa ho anche bisogno di avvolgere il distruttore? Si prega di specificare se questo potrebbe essere necessario in alcuni casi, ma non sempre.

È stato utile?

Soluzione

La confezione è di destra (in linea di principio), ma in

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

(come sottolinea l'interprete) si sta passando per oggetti lista la funzione di Python, non puntatori.

In breve, se la funzione ha solo bisogno di lavorare sulle liste di Python è necessario modificare il codice per utilizzare tale interfaccia (invece di utilizzare puntatori). Se è necessario mantenere tale interfaccia, si deve scrivere una funzione wrapper che prende una lista in pitone, esegue la conversione corretta e chiama la funzione originale C ++. Lo stesso vale per gli array NumPy.

Si prega di notare che il boost :: python offre alcuni meccanismo incorporato per convertire contenitori pitone al STL contenitori compatibili.

Un codice di avvolgimento esempio per il vostro caso potrebbe essere

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;
}

Si prega di dare un'occhiata al tutorial Boost.Python all'indirizzo http://www.boost.org/doc/libs/1_39_0/libs/python/doc/tutorial/doc/html/index.html .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top