【发布时间】:2014-09-13 08:39:05
【问题描述】:
我正在做一些图形编程,我有一个二维数组(在程序执行期间大小会发生变化),我使用 openGL 存储它。
所以当我去访问它时,我得到的只是一个void pointer 返回。
为了使逻辑更简单,我希望编译器假装它是二维数组,并将其用作二维数组(因为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] 一样访问内存。Vertex 只是一个 typedefed struct 包含 floats
但是,在我的 Windows 机器上,VS'12 非常适合,抱怨它需要将 tess 写入的整数为 constant(特别是 error C2057: expected constant expression)。
我不知道为什么。
现在,我了解 VS doesn't support VLA's,但我不是在此处创建数组,我正在创建对我不知道的东西的 引用 '直到运行时的大小。
所以它不应该关心函数调用之间的大小是否发生变化,对吧?为什么不允许这样做?
不要被吓倒我尝试使用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 0error C2540: non-constant expression as array bounderror C2440: 'initializing' : cannot convert from 'Vertex [1][1]' to 'Vertex (&)[][1]'
【问题讨论】:
-
它应该关心语言标准是否禁止它。
-
至于解决方案,您可以考虑一个抽象数组索引数学的小型帮助器类。
-
@OliCharlesworth,我现在正在尝试。我猜它只是让它变得不那么性感。你能详细说明一下,什么是被禁止的吗?
-
“禁止”可能太强了。 C++ 语言没有定义 VLA,因此编译器没有义务实现它们。
-
但这就是我的意思,我在这里看不到任何 VLA,这些都是引用和指针强制转换。没有分配新的内存;我有一些数据,我使用语法糖以不同方式解释(并因此访问)它
标签: c++ visual-c++ visual-studio-2012 reference variable-length-array