cython中的变量实例
出于示例的考虑,我有以下代码:cython中的变量实例,c,arrays,instance,cython,C,Arrays,Instance,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 = <
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
cimport cython
来自libc.stdlib cimport malloc
cdef int i
cdef国际ii
cdef int j=0
cdef int parnum=6
cdef int sysnum=2
cdef Particle*parlist=malloc(parnum*cython.sizeof(Particle))
cdef System*psys=malloc(sysnum*cython.sizeof(System))
对于范围内的i(sysnum):
psys[i].particles=malloc((parnum/sysnum)*cython.sizeof(Particle))
对于范围内的ii(parnum/sysnum):
psys[i].粒子[ii].x=j
parlist[j]=psys[i].粒子[ii]
j+=1
打印(“---更改之前---”)
对于范围内的i(sysnum):
对于范围内的ii(parnum/sysnum):
打印(psys[i].粒子[ii].x)
打印(“---更改之前---”)
对于范围内的i(parnum):
参数列表[i].x=0
打印(“---更改后---”)
对于范围内的i(sysnum):
对于范围内的ii(parnum/sysnum):
打印(psys[i].粒子[ii].x)
打印(“---更改后---”)
cdef结构系统:
粒子*粒子
cdef结构粒子:
整数x
当程序运行时,它在parlist元素更改前后打印相同的结果。
所以我不知道为什么,当我改变parlist的值时,psys.particles的值根本没有改变。这就好像parlist是一个副本,而不是一个实例。我如何使它成为一个实例,指向相同的东西
非常感谢好的,我读了一些关于指针的书,下面是我的解决方案:
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
cimport cython
来自libc.stdlib cimport malloc
cdef int i
cdef国际ii
cdef int j=0
cdef int parnum=6
cdef int sysnum=2
cdef Particle*parlist=malloc(parnum*cython.sizeof(Particle))
cdef System*psys=malloc(sysnum*cython.sizeof(System))
对于范围内的i(sysnum):
psys[i].particles=malloc((parnum/sysnum)*cython.sizeof(Particle))
psys[i].粒子=&parlist[j]
对于范围内的ii(parnum/sysnum):
参数列表[j].x=j
j+=1
打印(“---更改之前---”)
对于范围内的i(sysnum):
对于范围内的ii(parnum/sysnum):
打印(psys[i].粒子[ii].x)
打印(“---更改之前---”)
对于范围内的i(parnum):
参数列表[i].x=i*10
打印(“---更改后---”)
对于范围内的i(sysnum):
对于范围内的ii(parnum/sysnum):
打印(psys[i].粒子[ii].x)
打印(“---更改后---”)
对于范围内的i(parnum):
逐个更改(参数列表[i])
打印(“---在函数后逐个--”)
对于范围内的i(sysnum):
对于范围内的ii(parnum/sysnum):
打印(psys[i].粒子[ii].x)
打印(“---在函数后逐个--”)
全部更改(参数列表、参数)
打印(“---在函数后面所有--”)
对于范围内的i(sysnum):
对于范围内的ii(parnum/sysnum):
打印(psys[i].粒子[ii].x)
打印(“---在函数后面所有--”)
cdef逐个变化(粒子*par):
PAX×*=10
cdef更改\u全部(粒子*参数2,整数):
对于范围内的i(num):
参数2[i].x*=10
cdef结构系统:
粒子*粒子
cdef结构粒子:
整数x
我不知道它的使用是否正确,但它做的正是我所期望的