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にアップロードしたいからです。配列をゼロで初期化すると、ゼロがレンダリングされます。ただし、初期化すると(cで定義されているように)NULLになり、何もレンダリングされません。

編集2: 使用する理由は、openglと互換性を持たせるためにc_float、データをにキャストする必要があるためです。c_float

編集3:がゼロで構成されている 場合data、次のコードは、位置0/0でポイントの束をレンダリングします。GPUにNULL値を送信しても、ポイントがレンダリングされないことを期待していました。

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 Webサイトによると、GPUにメモリを割り当てる方法は次のとおりです。

glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW)

Pythonコードでこれを行うと、次のエラーが発生します。NameError: global name 'NULL' is not defined

しかし、Pythonでこれを行う方法があるはずですよね?

4

3 に答える 3

4

Aには 'None' に相当する値がないため、 a にc_float格納することはできません。Nonec_float

python ctypesdocsの表を参照してください- サポートするタイプがいくつかありますがNone、フロートとNone.

別のデータ型を使用するか、何らかの方法で値を個別に記録するか、アプリケーションで機能する float としてNone表す方法を見つける必要があります。None

于 2012-04-17T15:49:54.283 に答える
0

ctypes 経由で NULL 配列ポインタを渡したいですか? NoneNULL に使用します。NULL float 値を持つことはできませんが、NULL float 配列ポインターを持つことはできます。

@Anuragが言ったように、何も描画したくない場合は、描画する関数を呼び出さないでください。

于 2012-04-18T03:33:50.820 に答える
0

c_float に null 値があるとはどういう意味ですか? 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の場合、何も描画したくないようです。その場合、NULLが0であるため、c_floatsを「何もない」にする方法はありません。最良の方法は、配列をNULLとして設定し、何も描画しないことですif調子

于 2012-04-17T15:50:59.640 に答える