array_2D = new ushort * [nx];
// Allocate each member of the "main" array
//
for (ii = 0; ii < nx; ii++)
array_2D[ii] = new ushort[ny];
// Allocate "main" array
array_3D = new ushort ** [numexp];
// Allocate each member of the "main" array
for(kk=0;kk<numexp;kk++)
array_3D[kk]= new ushort * [nx];
for(kk=0;kk<numexp;kk++)
for(ii=0;ii<nx;ii++)
array_3D[kk][ii]= new ushort[ny];
numexp,nx和ny的值由用户获得..
这是动态分配3d数组的正确形式....我们知道代码适用于2D数组......如果这不正确可以有人建议更好的方法吗?
答案 0 :(得分:2)
我认为分配和处理多维数组的最简单方法是使用一个大的1d数组(或者更好的是std :: vector)并提供一个正确索引的接口。
这最容易在2维中首先考虑。考虑具有“x”和“y”轴的2D阵列
x=0 1 2 y=0 a b c 1 d e f 2 g h i
我们可以使用1-d数组来表示这一点,重新排列如下:
y= 0 0 0 1 1 1 2 2 2 x= 0 1 2 0 1 2 0 1 2 array: a b c d e f g h i
所以我们的二维数组就是
unsigned int maxX = 0;
unsigned int maxY = 0;
std::cout << "Enter x and y dimensions":
std::cin << maxX << maxY
int array = new int[maxX*maxY];
// write to the location where x = 1, y = 2
int x = 1;
int y = 2;
array[y*maxX/*jump to correct row*/+x/*shift into correct column*/] = 0;
最重要的是将访问包装成一个整洁的界面,这样你只需要弄清楚一次
(以类似的方式,我们可以使用三维数组
z = 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 y = 0 0 0 1 1 1 2 2 2 0 0 0 1 1 1 0 0 0 1 1 1 2 2 2 x = 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 array: a b c d e f g h i j k l m n o p q r s t u v w x
一旦你弄清楚如何正确地索引到数组并将这些代码放在一个公共位置,你就不必处理指向指针数组的指针数组的指针。你最后只需要删除一个[]。
答案 1 :(得分:1)
我也很好看,所以arr[numexp][nx][ny]
数组就是你想要的
一点提示:您可以将第三维的分配放入第二维的循环中,也就是在分配父子阵列时分配每个第三维:
ushort*** array_3D = new ushort**[nx];
for(int i=0; i<nx; ++i){
array_3D[i] = new ushort*[ny];
for(int j=0; j<ny; ++j)
array_3D[i][j] = new ushort[nz];
}
当然,一般提示:用std::vectors
做那个不必处理那些令人讨厌的(de)分配的东西。 :)
#include <vector>
int main(){
using namespace std;
typedef unsigned short ushort;
typedef vector<ushort> usvec;
vector<vector<usvec> > my3DVector(numexp, vector<usvec>(nx, vector<ushort>(ny)));
// size of -- dimension 1 ^^^^^^ -- dimension 2 ^^ --- dimension 3 ^^
}