3

例のためにこのコードがあります:

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 の値がまったく変更されない理由はわかりません。あたかも parlist がインスタンスではなくコピーであるかのようです。同じものを指してインスタンスにするにはどうすればよいですか?

どうもありがとう

4

1 に答える 1

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

正しい使い方かどうかはわかりませんが、期待どおりの動作をしています。

于 2013-02-27T15:36:36.960 に答える