2014-02-12 3 views
12

저는 Cython 및 C++의 멍청한 놈입니다. 그래서 인수에 관한 질문이 있습니다. 나는 다음과 같은 시나리오에서 인수의 사본을 전달 피하고 싶은 :Cython 및 C++ : 참조로 전달

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

난 그냥 v을 수정하는 방법 add_one 싶다 "에 장소를." 나는 C++을 믿는다. 포인터를 변경하면 pointee에게 전달된다는 것을 의미하는 &과 함께 인수를 미리 보류함으로써이를 달성 할 수있다. 그런 식으로, 당신은

add_one(v); # in c++ 

내가 사이 썬에서 동일한 작업을 수행, 아니면 명시 적으로 대신 참조로 인수 유형을 변경해야 할 수 즉, 포인터 또는 실제 개체를 전달 대해 걱정할 필요가 없습니다 즉 def add_one(vector[int]* vect)?

+0

[cython-users] (https://groups.google.com/forum/#!forum/cython-users)에서 약간의 관련 질문 [[ "참조 전달에 관한 질문]] (https://groups.google.com/forum/#!topic/cython-users/6c2ixr4xEZA) – iljau

답변

14

내 질문에 대한 답변을 찾았습니다. 분명히 참조로 전달할 수 있지만 함수는 cdef이어야하며 def이 아니어야합니다. ie

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