如何在python中创建空的c类型数组(或只有一个null值)?

s5a0g9ez  于 2022-10-18  发布在  Python
关注(0)|答案(3)|浏览(167)

我想知道是否(以及如何)可以在python中创建空的c类型数组。如果我想用零来初始化一个数组,下面的代码可以很好地工作:

from ctypes import *
data = [0 for i in xrange(10)]
a = ((c_float *10))(*data)

但是,如果data是None值的列表,我会收到一条错误消息:

data = [None for i in xrange(10)]
a = ((c_float *10))(*data)

TypeError:  float expected instead of NoneType instance

有没有一种方法可以初始化和数组为None或Null?

**EDIT 1:**我之所以想要一个None/Null的数组,是因为我想把这个数组上传到GPU上。如果我用零来初始化我的数组,那么将呈现零。但是,如果我将其初始化为NULL(如c中所定义),则不会呈现任何内容。
**EDIT 2:**使用c_float的原因是为了兼容OpenGL,我需要将我的数据转换成c_float
**编辑3:**如果data由零组成,则以下代码将呈现一串位置为0/0的点。我希望将NULL值发送到GPU不会导致渲染任何点。

glBindBuffer(GL_ARRAY_BUFFER, vbo)    
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(data), data)
glVertexPointer(n_COORDINATES_PER_VERTEX, GL_FLOAT, 0, 0)
glDrawArrays(GL_LINE_STRIP, 0, len(data))

**EDIT 4:**在python中可能需要使用NULL的另一个使用案例:根据opengl website,下面介绍如何在GPU上分配内存:

glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW)

如果我在我的python代码中这样做,我会得到以下错误:NameError: global name 'NULL' is not defined
但一定有一种方法可以在Python中做到这一点,对吗?

ogsagwnx

ogsagwnx1#

c_float没有‘None’的等价值,因此不能将None存储在c_float中。
请参阅pythonctypes文档中的表格--有一些类型支持None--但没有一种类型同时支持浮点数和None
您必须使用另一种数据类型,以某种方式单独记录None值,或者找到一种方法将None表示为适合您的应用程序的浮点数。

ajsxfq5m

ajsxfq5m2#

C_浮点值为空值是什么意思?在C中,NULL是零,所以基本上您希望有一个零的数组,这可以通过转换None的数组来实现,例如

from ctypes import *
data = [None for i in xrange(10)]

# convert to zeroes

data = [i or 0 for i in data]
a = ((c_float *10))(*data)

编辑:如果值为None,则看起来您不想绘制任何内容,在这种情况下,没有办法使用带有‘Nothing’的c_Floats,因为NULL为0,最好的方法是将数组设置为NULL,并且不使用if条件绘制任何内容

dffbzjpn

dffbzjpn3#

是否要通过ctype传递空数组指针?使用None表示空。你不能有一个空的浮点值,但是你可以有一个空的浮点数组指针。
就像@Anurag说的那样,如果你不想画任何东西,就不要调用绘制函数。

相关问题