2013-02-26 4 views
3

У меня есть этот код ради примера:переменная экземпляра в Cython

cimport cython 
from libc.stdlib cimport malloc 

cdef int i 
cdef int ii 
cdef int j = 0 
cdef int parnum = 6 
cdef int sysnum = 2 
cdef Particle *parlist = <Particle *>malloc(parnum * cython.sizeof(Particle)) 
cdef System *psys = <System *>malloc(sysnum * cython.sizeof(System)) 

for i in range(sysnum): 
    psys[i].particles = <Particle *>malloc((parnum/sysnum) * cython.sizeof(Particle)) 
    for ii in range(parnum/sysnum): 
     psys[i].particles[ii].x = j 
     parlist[j] = psys[i].particles[ii] 
     j += 1 

print("--- before changes ---") 
for i in range(sysnum): 
    for ii in range(parnum/sysnum): 
     print(psys[i].particles[ii].x)   

print("--- before changes ---") 

for i in range(parnum): 
     parlist[i].x = 0 

print("--- after changes ---") 
for i in range(sysnum): 
    for ii in range(parnum/sysnum): 
     print(psys[i].particles[ii].x) 
print("--- after changes ---") 


cdef struct System: 
    Particle *particles 

cdef struct Particle: 
    int x 

Когда программа запускается она печатает тот же результат до и после изменения parlist элементов. Так что я не знаю, почему, когда я изменяю значение parlist, значение psys.particles не изменяется вообще. Это как если бы парлист был копией, а не экземпляром. Как сделать его экземпляром, указывая на то же самое?

Большое спасибо

ответ

1

Хорошо, я прочитал немного о указателю и вот мое решение:

cimport cython 
from libc.stdlib cimport malloc 

cdef int i 
cdef int ii 
cdef int j = 0 
cdef int parnum = 6 
cdef int sysnum = 2 
cdef Particle *parlist = <Particle *>malloc(parnum * cython.sizeof(Particle)) 
cdef System *psys = <System *>malloc(sysnum * cython.sizeof(System)) 

for i in range(sysnum): 
    psys[i].particles = <Particle *>malloc((parnum/sysnum) * cython.sizeof(Particle)) 
    psys[i].particles = &parlist[j] 
    for ii in range(parnum/sysnum): 
     parlist[j].x = j 
     j += 1 

print("--- before changes ---") 
for i in range(sysnum): 
    for ii in range(parnum/sysnum): 
     print(psys[i].particles[ii].x)   

print("--- before changes ---") 

for i in range(parnum): 
     parlist[i].x = i * 10 

print("--- after changes ---") 
for i in range(sysnum): 
    for ii in range(parnum/sysnum): 
     print(psys[i].particles[ii].x) 
print("--- after changes ---") 

for i in range(parnum): 
    change_onebyone(&parlist[i]) 

print("--- after function one by one ---") 
for i in range(sysnum): 
    for ii in range(parnum/sysnum): 
     print(psys[i].particles[ii].x) 
print("--- after function one by one ---") 

change_all(parlist,parnum) 

print("--- after function all---") 
for i in range(sysnum): 
    for ii in range(parnum/sysnum): 
     print(psys[i].particles[ii].x) 
print("--- after function all---") 

cdef change_onebyone(Particle *par): 
    par.x *= 10 

cdef change_all(Particle *parlist2, int num): 
    for i in range(num): 
     parlist2[i].x *= 10 

cdef struct System: 
    Particle *particles 

cdef struct Particle: 
    int x 

Я не знаю, если это правильное использование его, но он делает то, что я ожидается.

Смежные вопросы