2014-02-12 3 views
12

Ich bin ein Noob mit Cython und C++, so habe ich eine Frage zum Argument übergeben. Ich möchte im folgenden Szenario eine Kopie eines Arguments vermeiden vorbei:Cython & C++: Durch Referenz

# somefile.pyx 
#distutils: language = c++ 
from libcpp.vector cimport vector 

def add_one(vector[int] vect): 
    cdef int i 
    n = vect.size() 
    for i in range(n): 
     vect[i] += 1 

cdef vector[int] v 
for i in range(100000): 
    v.push_back(i) 
add_one(v) # <-- ?? 

ich die Methode add_one möchte nur v ändern „in-place.“ Ich glaube an C++, Sie können dies erreichen, indem Sie das Argument mit & voraussetzen, was bedeutet, dass alle Änderungen an dem Zeiger an den Zeiger übergeben werden. Auf diese Weise müssen Sie sich keine Sorgen über einen Zeiger oder das eigentliche Objekt übergeben, dh

add_one(v); # in c++ 

Kann ich das gleiche tun in Cython, oder muss ich explizit die arg Typ stattdessen auf eine Referenz ändern, zB def add_one(vector[int]* vect)?

+0

Etwas damit verbundene Frage auf [cython-users] (https://groups.google.com/forum/#!forum/cython-users): [ "Frage zum Pass-by-reference"] (https://groups.google.com/forum/#!topic/cython-users/6c2ixr4xEZA) – iljau

Antwort

14

Die Antwort auf meine eigene Frage gefunden. Anscheinend können Sie durch Verweis gehen, aber die Funktion muss cdef 'Ed, nicht def' ed sein. dh

# somefile.pyx 
#distutils: language = c++ 
from libcpp.vector cimport vector 

cdef void add_one(vector[int]& vect): 
    cdef int i 
    n = vect.size() 
    for i in range(<int>n): 
     vect[i] += 1 

cdef vector[int] v 
for i in range(100000): 
    v.push_back(i) 
add_one(v)