来自 C++ 的 Cython 修改指针
Cython modifiy pointer from c++
我需要修改从 cython 传递到 c++ 函数的 NumPy 数组。一切正常,但是当我在调用 c++ 修饰函数后打印出值时,该值与调用该函数之前的值保持不变。我也对字符串进行了相同的尝试,但效果不佳。我使用类型化的内存视图来访问内存。下面是我使用的代码(只保留与这个问题相关的内容)
test.h
#include <iostream>
struct S1 {
float* buffer;
int length;
};
int modify(S1* s1, char* str);
test.cpp
#include "test_modify.h"
int modify(S1* s1, char* str) {
str = "newstr"; // string modify
int out_idx = 0;
while(out_idx < s1->length) {
s1->buffer[out_idx++] = 10; // array modify
}
return 0;
}
test.pyx
from numpy import pi, cos, sin, arccos, arange
import numpy as np
cimport numpy as np
np.import_array()
cdef extern from "test_modify.h":
cdef struct S1:
float* buffer
int length
int modify(S1* s1, char* str)
def modifyPY():
d = np.zeros((2, 3, 3), dtype=np.float32)
cdef float[:, :, ::1] d_view = d.astype(np.float32)
cdef S1 s1 = [&(d_view[0, 0, 0]), np.product(d.shape)]
cdef char *s = 'jhk'
modify(&s1, s)
return d, s
** setup.py**
from setuptools import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
extensions = [
Extension("temp",
sources=["test.pyx", "test_modify.cpp"],
include_dirs=[numpy.get_include()],
extra_compile_args=["-O3", '-std=c++11'],
language="c++")
]
setup(
ext_modules=cythonize(extensions)
)
# to install run, python setup.py build_ext --inplace
test.py(构建后运行)
import temp
d, s = temp.modifyPY()
print(d) # still 0's, should be 10's
print(s) # still "jhk" should be "newstr'
cdef float[:, :, ::1] d_view = d.astype(np.float32)
Docs:
By default, astype
always returns a newly allocated array
即d_view
是 d
副本的视图,而不是 d
的视图。因此,我们不希望 d_view
所做的更改反映在 d
.
中
int modify(S1* s1, char* str) {
str = "newstr"; // string modify
这是一个基本的 C 指针传递问题。 str
和Python中的s
都指向同一个地方,但它们是不同的指针。 str
在 str = "newstr"
中重新分配后,它们现在指向不同的地方。
您可能想要一个指向指针的指针 (char**
)?
我需要修改从 cython 传递到 c++ 函数的 NumPy 数组。一切正常,但是当我在调用 c++ 修饰函数后打印出值时,该值与调用该函数之前的值保持不变。我也对字符串进行了相同的尝试,但效果不佳。我使用类型化的内存视图来访问内存。下面是我使用的代码(只保留与这个问题相关的内容)
test.h
#include <iostream>
struct S1 {
float* buffer;
int length;
};
int modify(S1* s1, char* str);
test.cpp
#include "test_modify.h"
int modify(S1* s1, char* str) {
str = "newstr"; // string modify
int out_idx = 0;
while(out_idx < s1->length) {
s1->buffer[out_idx++] = 10; // array modify
}
return 0;
}
test.pyx
from numpy import pi, cos, sin, arccos, arange
import numpy as np
cimport numpy as np
np.import_array()
cdef extern from "test_modify.h":
cdef struct S1:
float* buffer
int length
int modify(S1* s1, char* str)
def modifyPY():
d = np.zeros((2, 3, 3), dtype=np.float32)
cdef float[:, :, ::1] d_view = d.astype(np.float32)
cdef S1 s1 = [&(d_view[0, 0, 0]), np.product(d.shape)]
cdef char *s = 'jhk'
modify(&s1, s)
return d, s
** setup.py**
from setuptools import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
extensions = [
Extension("temp",
sources=["test.pyx", "test_modify.cpp"],
include_dirs=[numpy.get_include()],
extra_compile_args=["-O3", '-std=c++11'],
language="c++")
]
setup(
ext_modules=cythonize(extensions)
)
# to install run, python setup.py build_ext --inplace
test.py(构建后运行)
import temp
d, s = temp.modifyPY()
print(d) # still 0's, should be 10's
print(s) # still "jhk" should be "newstr'
cdef float[:, :, ::1] d_view = d.astype(np.float32)
Docs:
By default,
astype
always returns a newly allocated array
即d_view
是 d
副本的视图,而不是 d
的视图。因此,我们不希望 d_view
所做的更改反映在 d
.
int modify(S1* s1, char* str) {
str = "newstr"; // string modify
这是一个基本的 C 指针传递问题。 str
和Python中的s
都指向同一个地方,但它们是不同的指针。 str
在 str = "newstr"
中重新分配后,它们现在指向不同的地方。
您可能想要一个指向指针的指针 (char**
)?