2

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

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

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

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

TypeError:  float expected instead of NoneType instance

有没有办法用 NONE 或 NULL 初始化和排列?

编辑 1: 我想要一个带有 None / Null 的数组的原因是我想将此数组上传到 GPU。如果我用零初始化我的数组,那么将呈现零。但是,如果我将其初始化为 NULL(如 c 中所定义),则不会呈现任何内容。

编辑2: 使用的原因c_float是我需要将我的数据转换c_float为它才能与opengl兼容。

编辑 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))

编辑 4: 您可能想NULL在 python 中使用的另一个用例:根据opengl 网站,以下是如何在 GPU 上分配内存:

glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW)

如果我在我的 python 代码中执行此操作,我会收到以下错误:NameError: global name 'NULL' is not defined

但必须有办法在 python 中做到这一点,对吧?

4

3 回答 3

4

Ac_float没有等效的“无”值,因此您不能存储None在 a 中c_float

请参阅pythonctypes文档中的表格- 有一些类型支持None- 但没有一个支持浮点数和None.

您将不得不使用替代数据类型,None以某种方式分别记录值,或者找到一种表示None为适用于您的应用程序的浮点数的方法。

于 2012-04-17T15:49:54.283 回答
0

c_float 有空值是什么意思?在 C 中 null 为零,所以基本上你想要一个零数组,你可以通过转换无数组来做到这一点,例如

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,看起来你不想绘制任何东西,在这种情况下,没有办法让c_floats'nothing'因为NULL是0,最好的方法是将数组设置为NULL而不使用绘制任何东西if(健康)状况

于 2012-04-17T15:50:59.640 回答
0

你想通过 ctypes 传递一个 NULL 数组指针吗?用于NoneNULL。你不能有一个 NULL 浮点值,但你可以有一个 NULL 浮点数组指针。

就像@Anurag 说的那样,如果您不想绘制任何东西,请不要调用该函数进行绘制。

于 2012-04-18T03:33:50.820 回答