私は少しグラフィックプログラミングを行っており、openGL を使用して保存する 2 次元配列 (プログラムの実行中にサイズが変化する) を持っています。
そのため、アクセスしようとすると、返されるのはvoid
ポインタだけです。
ロジックを簡単にするために、コンパイラに 2D 配列であると偽らせて、2D 配列として使用するようにします (arr[i][j]
は より簡潔でエラーが発生しにくいためptr[i * y + j]
)。
私が見つけたこの巧妙なキャスト方法は、GCC (uni の Linux マシン上) でうまく機能します。
Vertex (&vertices)[tess][tess] = *reinterpret_cast<Vertex (*)[tess][tess]>(
glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY)
);
これは基本的に、openGL が提供したメモリ ポインターのブロックをtess X tess
2D 配列にキャストし、その型の参照を作成してそれを指すようにします。
これにより、のようにメモリにアクセスできますvertices[i][j]
。sを含む
Vertex
単なるtypedef
edですstruct
float
ただし、私の Windows マシンの自宅では、VS'12 はヒッシーなフィット感を持っており、(具体的には ; )tess
に書かれている整数が必要であると不平を言っています。
理由がわかりません。constant
error C2057: expected constant expression
ここで、 VS が VLA をサポートしていないことは理解していますが、ここでは配列を作成していません。実行時までのサイズがわからないものへの参照を作成しています。
したがって、関数呼び出し間でサイズが変化しても気にする必要はありませんよね? これが許可されないのはなぜですか?
思いとどまらず使ってみましたstd::array
std::array<std::array<Vertex, tess>, tess>& vertices;
そして、明らかなことは別として、references must be initialized
このテストはまだ不平を言っているので役に立ちませんでしたexpression must have a constant value
(具体的には;error C2975: '_Size' : invalid template argument for 'std::array', expected compile-time constant expression
)
私はここで何をしようか途方に暮れています。私はとても誇りに思ってreinterpret_cast
いました.
ポインターからを作成したくありませんstd::vector
。完了したら、その動的配列からポインターの場所にデータをコピーします。メモリブロックがすでにそこに座っているだけの場合、それは非常に非効率的です! 既存のメモリ ブロックの周り
にベクトルを作成する方法はありませんね。..いいえ、ばかげているように聞こえます。
あきらめずにそのまま使用できるかどうかを確認したいVertex*
; アイデア?
VSで機能しない理由について誰かが教えてくれますか?
動作させるためにできることはありますか (VS の拡張/更新)?
VS'13 はこれのサポートを追加しますか?
C2087: 'vertices' : missing subscript
説明できない
エラーも発生しています。VSが必死に一定になり
たいことを示しているように見えるこれらの他のエラーと同様に:tess
error C2466: cannot allocate an array of constant size 0
error C2540: non-constant expression as array bound
error C2440: 'initializing' : cannot convert from 'Vertex [1][1]' to 'Vertex (&)[][1]'