首页 > 解决方案 > Cython 无法将 python 对象转换为 const float *

问题描述

我正在包装一个用 C++ 编写的绘图库,目前正在研究最终的绘图功能。我正在使用imgui-plot,因此要感谢 soulthreads 的写作。话虽如此,我已经通过将头文件中的所有结构移动到父级然后将它们分配给 plotconfig 结构来稍微修改了代码。

以下是为便于阅读而编辑的相关代码片段:

imgui-plot.h

struct Values{
    const float xs* = nullptr
    const float ys* = nullptr
};

struct PlotConfig{
    Values values
};

cimgui.pxd

cdef extern from 'imgui-plot.h' namespace 'ImGui':
    cdef struct Values:
        const float xs*
        const float ys*

    cdef struct PlotConfig:
        Values values

核心.pyx

import cimgui

def plot(x_data, y_data):
    cdef cimgui.PlotConfig conf
    conf.values.xs = x_data
    conf.values.ys = y_data

    cimgui.Plot(conf)

我得到的错误

> conf.values.xs = x_data

Cannot convert python object to 'const float *'

我尝试将 x_data 放入向量中并使其变为非常数。我现在意识到该错误可能与作为常量指针或对内存位置的引用的变量以及 python 的数组对象抽象有关。

无论如何,我真的很感激这方面的一些提示。

标签: pythonc++arrayscython

解决方案


对于那些想知道的人,这些似乎对我有用。我创建了一个向量,将值推到它上面,并将指针分配给第一个值。

核心.pyx

from libcpp.vector cimport vector
import cimgui

def plot(x_data, y_data):
    cdef cimgui.PlotConfig conf
    cdef vector[float] x_s
    cdef vector[float] y_s

    for x in x_data:
      x_s.push_back(x)
    for y in y_data:
      y_s.push_back(y)

    conf.values.xs = &x_s[0]
    conf.values.ys = &y_s[0]

    cimgui.Plot(conf)

推荐阅读