来自 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_viewd 副本的视图,而不是 d 的视图。因此,我们不希望 d_view 所做的更改反映在 d.


int modify(S1* s1, char* str) {
    str = "newstr"; // string modify

这是一个基本的 C 指针传递问题。 str和Python中的s都指向同一个地方,但它们是不同的指针strstr = "newstr" 中重新分配后,它们现在指向不同的地方。

您可能想要一个指向指针的指针 (char**)?