C++ 如何获得VC++;以二维数组形式访问指针的步骤

C++ 如何获得VC++;以二维数组形式访问指针的步骤,c++,visual-c++,visual-studio-2012,reference,variable-length-array,C++,Visual C++,Visual Studio 2012,Reference,Variable Length Array,我正在做一些图形编程,我有一个二维数组(在程序执行过程中大小不同),我使用openGL存储该数组。 所以当我去访问它时,我得到的只是一个支持 为了简化逻辑,我希望编译器假装它是一个2D数组,并将其用作2D数组(因为arr[I][j]比ptr[I*y+j]更简洁,更不容易出错) 我发现这种巧妙的强制转换方法在GCC(在uni的linux机器上)中效果很好: 顶点和顶点[tess][tess]=*重新解释( glMapBuffer(GLU数组缓冲区,仅GLU写缓冲区) ); 它基本上将openG

我正在做一些图形编程,我有一个二维数组(在程序执行过程中大小不同),我使用openGL存储该数组。
所以当我去访问它时,我得到的只是一个支持

为了简化逻辑,我希望编译器假装它是一个2D数组,并将其用作2D数组(因为
arr[I][j]
ptr[I*y+j]
更简洁,更不容易出错)


我发现这种巧妙的强制转换方法在GCC(在uni的linux机器上)中效果很好:

顶点和顶点[tess][tess]=*重新解释(
glMapBuffer(GLU数组缓冲区,仅GLU写缓冲区)
);
它基本上将openGL给我的内存块指针转换为
tess X tess
2D数组,并创建该类型的引用来指向它。
这允许我访问内存,如
顶点[i][j]

Vertex
只是一个
typedef
ed
struct
包含
float
s

然而,在我的Windows机器上,VS'12有一个嘶嘶的配合,抱怨它要求写入
tess
的整数是
常量(
error C2057:预期的常量表达式
)。
我不知道为什么

现在,我明白了,但我不是在这里创建一个数组,我是在创建一个引用,我不知道'till runtime'的大小。
所以它不应该关心函数调用之间的大小是否改变,对吗?为什么这是不允许的


为了不被阻止,我尝试使用
std::array

std::数组和顶点;
除了明显的
引用必须初始化之外
这个测试对我没有帮助,因为它仍然抱怨
表达式必须有一个常量值
(特别是;
错误C2975:“\u Size”:std::array的模板参数无效,预期的编译时常量表达式


我不知道该在这里尝试什么,我为
重新解释演员阵容
感到骄傲,因为它使事情变得如此简单,我确信我没有使用违反标准的方法。
我不想从指针创建一个
std::vector
,然后在完成后将数据从动态数组复制回指针位置;当内存块已经放在那里时,这看起来效率太低了
没有办法在预先存在的内存块周围创建一个向量,是吗。。不,听起来很傻

我想看看这是否可以做到,而不必放弃,只需将其用作
顶点*
;想法?
有人能告诉我为什么它在VS中不起作用吗?
我能做些什么来让它工作(VS的扩展/更新)?
VS'13是否增加了对此的支持

我还收到了错误
C2087:“顶点”:缺少下标,我无法解释。
除了这些似乎显示VS迫切希望
tess
保持不变的错误之外:
错误C2466:无法分配大小为0的常量数组
错误C2540:数组绑定的非常量表达式

错误C2440:“正在初始化”:无法从“顶点[1][1]”转换为“顶点(&)[1]”

那很有趣;我实现了一个类来处理我想要的东西。
它不像我希望的那样类型安全,但我在这方面学到了很多
很像我在发现jQuery之前实现javascript应该是规范的一部分、语法上类似于糖的功能的感觉

基本上,我们无法做到这一点

int(&array)[x][y]=*重新解释强制转换(指针);
你必须这样做

MDAI数组=MDAI(指针,x,y);
但除此之外,它工作得完美无缺D
我最初只编写了一个专门的TwoDArray类,但发现实际上我也有一些3D阵列。
因此,我没有实现3D版本(在深入研究时返回TwoDArray),而是做了一些更通用的东西,可以帮助处理任意多维度的数组


#包括
#包括
/*多维阵列解释
编译器是否像使用刻面数组一样使用平面指针引用
C++11/GCC VLA支持同等标准:
int(&数组)[x][y]=*重新解释强制转换(指针);

使用MDAI,它应该关心语言标准是否禁止它。至于解决方案,可以考虑一个小的助手类来抽象数组索引数学。@ OliCharlesworth,我现在正在尝试。我想这只会让它不那么性感。你能详细说明什么是禁止的吗?“禁止”可能太强了。C++语言没有定义VLAs,所以编译器没有义务实现它们。但是这是我的观点,我在这里没有看到任何VLA,这些都是引用和指针转换。没有分配新内存;我有一些数据,我使用语法语法对其进行了不同的解释(从而访问)。您可以使用调用替换那些
if
语句来进行编译时检查