由于栈的空间不够,我开辟了一块儿动态内存空间,代码如下:GLubyte ***image;//根据需要,开辟一类似多维数组的内存空间
image=new GLubyte**[480];
for(int i=0;i<480;i++)
image[i]=new GLubyte *[640];
for( i=0;i<480;i++)
for(int j=0;j<640;j++)
image[i][j]=new GLubyte[3];glReadBuffer(GL_BACK);
//此处的image应该是一个三维数组,其中存储的信息包括二维像素坐标和RGB
glReadPixels(0,0,640,424,GL_RGB,GL_UNSIGNED_BYTE,image);但总是出现地址访问错误,经检测,新开辟的空间没出错误。
如果用普通的多维数组,如:GLubyte image[424][640][3];
glReadBuffer(GL_BACK);
glReadPixels(0,0,640,424,GL_RGB,GL_UNSIGNED_BYTE,image);则运行正常
请问这是为什么
image=new GLubyte**[480];
for(int i=0;i<480;i++)
image[i]=new GLubyte *[640];
for( i=0;i<480;i++)
for(int j=0;j<640;j++)
image[i][j]=new GLubyte[3];glReadBuffer(GL_BACK);
//此处的image应该是一个三维数组,其中存储的信息包括二维像素坐标和RGB
glReadPixels(0,0,640,424,GL_RGB,GL_UNSIGNED_BYTE,image);但总是出现地址访问错误,经检测,新开辟的空间没出错误。
如果用普通的多维数组,如:GLubyte image[424][640][3];
glReadBuffer(GL_BACK);
glReadPixels(0,0,640,424,GL_RGB,GL_UNSIGNED_BYTE,image);则运行正常
请问这是为什么
当然,我没有opengl, 不知道glReadPixels()行不行。
现在这样new出来的数组,image+1 = image[1][0][0];
普通的多维数组, image+1 = image[0][0][1];
所以出错了。
例:
double *m_modelview=new double[16];
glGetDoublev(GL_MODELVIEW_MATRIX,m_modelview);
double *m_projection=new double[16];
glGetDoublev(GL_PROJECTION_MATRIX,m_projection);
int *m_viewport=new int[4];
glGetIntegerv(GL_VIEWPORT,m_viewport);
for(int k=0;k<9;k++)
{
for(int i=0;i<5;i++)
{
gluProject(obj3DCoor[k][i][0],obj3DCoor[k][i][1],obj3DCoor[k][i][2]+translate_z,m_modelview,m_projection,m_viewport,&win2DCoor[frame][k][i][0],
&win2DCoor[frame][k][i][1],&win2DCoor[frame][k][i][2]);
}
}
delete []m_modelview;
delete []m_projection;
delete []m_viewport;
难道一维和多维有什么不同吗
开辟动态空间实际就是定义指针,指针不也是按照首地址进行计算的吗
多维数组,就要看分配地址的顺序了。
在栈申请了一个20*10的char数组,假设地址是Addr
char test[10][20];
那么test[0][5]这个元素的地址就是 Addr + 0 * 20 + 5 = Addr + 5,这也是C++编译器对多维数组的翻译方法;但是如果按照new 的方法来申请 test = new *char[10]; 假设首地址还是Addr
那么Addr + 5这个位置就应该是test[5];
而编译器依然按照多维数组的方式翻译test[0][5],就会跑到test[5]的位置去;因此,最后new得到的空间虽然大小跟直接使用多维数组的一样,但是存储顺序已大相径庭,
将image指针传递过去自然也就出错了,这个要解决就得手动操作了,唉,太复杂,还是等高手吧~
我做了一个实验
***(image+1)=image[1][0][0];
**(*image+1)=image[0][1][0];
*(**image+1)=image[0][0][0];
但从首地址image到地址**image是怎样的一个过程
即它的内部是怎样存储数据的
敬候高手解答!!
new GLubyte[640*480*3]
然后访问的时候就直接按照正常的多维数组的访问方法来访问。