【发布时间】:2018-10-02 23:49:08
【问题描述】:
我有以下(在现实生活中,C 代码要复杂得多,我不想更改它。它到处都使用全局变量)。:
from cffi import FFI
ffibuilder = FFI()
ffibuilder.set_source(
"mymodule",
r"""
#include <stdio.h>
float *x, *y, *z;
int n;
void some_func(){
int i;
for(i==0; i<n; i++) printf("%f %f %f\n", x[i], y[i], z[i]);
}
"""
)
ffibuilder.cdef(
"""
float *x, *y, *z;
int n;
void some_func();
"""
)
if __name__=="__main__":
ffibuilder.compile()
from mymodule import ffi, lib
import numpy as np
n = 4
lib.n = n
for i, k in enumerate(['x','y', 'z']):
v = i*np.arange(n, dtype=np.float32)
v.__repr__() # Need to do this for some reason!!
setattr(lib, k, ffi.cast('float*', ffi.from_buffer(v)))
lib.some_func()
预期的打印输出(来自some_func)是:
0.000000 0.000000 0.000000
0.000000 1.000000 2.000000
0.000000 2.000000 4.000000
0.000000 3.000000 6.000000
这确实是我得到的。但是,如果我取出我拨打v.__repr__() 的线路,我会得到以下信息:
0.000000 0.000000 0.000000
1.000000 1.000000 2.000000
2.000000 2.000000 4.000000
3.000000 3.000000 6.000000
即似乎x 的内存要么被y 覆盖,要么指向y。如果我只有x 和y(没有z),那么一切都会按预期进行。
使用double 代替float 表现出相同的行为。
关于我做错了什么有什么想法吗?谢谢!
【问题讨论】:
标签: python python-3.x numpy python-cffi