【问题标题】:Python double pointerPython 双指针
【发布时间】:2009-05-06 05:23:05
【问题描述】:

我试图从指向浮点数组的指针中获取值,但它在 python 中返回为 c_void_p

C 代码

double v;
const void *data;  
pa_stream_peek(s, &data, &length);  
v = ((const float*) data)[length / sizeof(float) -1];

到目前为止的 Python

import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 

问题是 null_ptr 有一个 int 值(内存地址?)但是没有办法读取数组?!

【问题讨论】:

    标签: python ctypes


    【解决方案1】:

    我的 ctypes 生锈了,但我相信你想要 POINTER(c_float) 而不是 c_void_p。

    所以试试这个:

    null_ptr = POINTER(c_float)()
    pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
    null_ptr[0]
    null_ptr[5] # etc
    

    【讨论】:

    • 在 POINTER(c_float)() 中传递的干杯工作完美。我还添加了更新类型包装器,例如从 pa_stream_peek.argtypes = [POINTER(pa_stream), POINTER(POINTER(None) ), POINTER(c_size_t)] 到 pa_stream_peek.argtypes = [POINTER(pa_stream), POINTER(POINTER(c_float)), POINTER(c_size_t)] 给出数据 = POINTER(c_float)() pa_stream_peek(stream, data, ctypes.c_ulong(长度)) v = 数据[0]
    【解决方案2】:

    要以模仿您的 C 代码的方式使用 ctypes,我建议(而且我已经过时且未经测试):

    vdata = ctypes.c_void_p()
    length = ctypes.c_ulong(0)
    pa_stream_peek(stream, ctypes.byref(vdata), ctypes.byref(length))
    fdata = ctypes.cast(vdata, POINTER(float))
    

    【讨论】:

      【解决方案3】:

      您可能还希望使用 byref 传递 null_ptr,例如

      pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length))
      

      【讨论】:

        【解决方案4】:

        当您在不使用 ctypes.pointer 或 ctypes.byref 的情况下传递指针参数时,它们的内容会简单地设置为内存地址的整数值(即指针位)。这些参数应该与byref 一起传递(或pointer,但byref 的开销更少):

        data = ctypes.pointer(ctypes.c_float())
        nbytes = ctypes.c_sizeof()
        pa_stream_peek(s, byref(data), byref(nbytes))
        nfloats = nbytes.value / ctypes.sizeof(c_float)
        v = data[nfloats - 1]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-05
          • 2016-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多