2

我正在尝试调用一个接受指向指针的指针并将其重定向到内部分配的一维数组的 C 函数,沿着这条线:

typedef myStruct {
    const char* name;
    int status;
} myStruct;

int foo(const myStruct** array, size_t* size);

我正在尝试用 Python 和 NumPy 包装它,并获得一个包装该内部存储器的 NumPy 数组(作为只读)。

我有以下内容:

arr = np.ctypeslib.ndpointer(dtype=np.dtype([('name', np.intp),
                                             ('status', np.int)]))()
size = ct.c_size_t()
_call('foo', ct.byref(arr), ct.byref(size))
arr = np.ctypeslib.as_array(arr, shape=(size.value,))
arr.flags.writeable = False # not our memory!

_call()检查返回值的包装器在哪里。

我得到以下信息:

ValueError: '<P' is not a valid PEP 3118 buffer format string

打电话给as_array(). 我究竟做错了什么?


编辑:我的目标是将数据读取为 NumPy 结构化数组,因为我认为这是在 python 中描述 C 结构数组的最佳方式。

4

1 回答 1

0

这可能被视为一个错误ndpointer- 问题是as_array检查它的参数是否是一个指针,但是该测试对于 ndpointer 失败,并且 numpy 尝试创建一个包含单个指针的数组(由于 numpy 没有指针而失败类型)。

你可以在不使用 numpy 的情况下过得很好:

class myStruct(ctypes.Structure):
    _fields_ = [
        ('name', ctypes.c_char_p),
        ('status', ctypes.c_int),
    ]

arr = ctypes.POINTER(myStruct)()
size = ct.c_size_t()
_call('foo', ct.byref(arr), ct.byref(size))

# convert from `myStruct*` to `myStruct[size]`
arr = ctypes.cast(arr, ctypes.POINTER(myStruct * size.value)).contents

arr现在是一个 ctypes 数组。

于 2019-01-06T23:03:00.627 回答