3D阵列的C/C++初始化/转换
float sampleGrid1[5][5][5] =
{
{
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0}
},
{
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0}
},
{
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0, 0.0},
{0.0, 1.0, 1.0, 1.0, 0.0},
{0.0, 0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0}
},
{
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0}
},
{
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0}
}
};
typedef struct
{
int Nx;
int Ny;
int Nz;
float*** M;
}OG;
相关功能:3D阵列的C/C++初始化/转换
OG *newOG(){
OG *newOG = (OG *)malloc(sizeof(OG));
if (newOG == NULL)
{
throw std::exception("newOG : no memory is available");
}
return newOG;
}
int initiateOG(OG *MyOG)
{
ifstream dump("OGdump3.txt");
if (dump.is_open())
{
while (dump.good())
{
dump >> MyOG->Nx;
dump >> MyOG->Ny;
dump >> MyOG->Nz;
MyOG->M = new float**[MyOG->Nx];
for(int i = 0; i < MyOG->Nx; i++)
{
MyOG->M[i] = new float*[MyOG->Ny];
for(int j = 0; j < MyOG->Ny; j++)
{
MyOG->M[i][j] = new float[MyOG->Nz];
}
}
for(int z=0;z < MyOG->Nz; z++){
for(int y=0;y < MyOG->Ny; y++){
for(int x=0;x < MyOG->Nx; x++){
dump >> MyOG->M[x][y][z];
}
}
}
}
dump.close();
}
else return 0;
return 1;
}
我要硬一些代码示例网格到代码,但不知道创造他们的最好方式,做我必须使用循环?
我不想改变我的typedef结构OG,如果修改可能
:
OG *occupancyGrid;
void initialize3dArray(int x, int y, int z,float*** array)
{
array = new float**[x];
for(int i = 0; i < x; i++)
{
array[i] = new float*[y];
for(int j = 0; j < y; j++)
{
array[i][j] = new float[z];
}
}
}
void sampleOG1()
{
occupancyGrid = newOG();
occupancyGrid->Nx = 5;
occupancyGrid->Ny = 5;
occupancyGrid->Nz = 5;
initialize3dArray(5, 5, 5,occupancyGrid->M);
for(int z=0;z < occupancyGrid->Nz; z++){
for(int y=0;y < occupancyGrid->Ny; y++){
for(int x=0;x < occupancyGrid->Nx; x++){
occupancyGrid->M[x][y][z] = sampleGrid1[x][y][z];
}
}
}
}
initialize3dArray这个函数没有编译错误,但仍导致程序崩溃
是的。那将不会编译,因为float[5][5][5]
和float ***
不是相同的类型。它们甚至不是兼容类型。一个不能自动转换为其他。
但是,float[5][5][5]
可以自动转换为float (*)[5][5]
。因此,这是合法的代码:
float (*m)[5][5];
m = sampleGrid1; //legal - allowed!
所以定义OG
为,
struct OG
{
int Nx;
int Ny;
int Nz;
float (*M)[5][5];
};
如果OG
如上定义,那么你可以这样写:
OG* temp = newOG();
temp->Nx = 5;
temp->Ny = 5;
temp->Nz = 5;
occupancyGrid->M = sampleGrid1; //DONT use &
float x[2][2]
是一个浮点二维数组 - 它不是浮点指针的一维数组。从数组到指针的转换仅适用于此类数组的第一维。
鉴于float x[2][2]
您预留4个浮标的空间。在另一方面,一个float **
变量是指针的指针到浮 - 有没有指针随时随地float x[2][2]
同一门课程的一个三维阵列也是如此 - 你的3D阵列已经没有偷偷藏在它里面的指针,它不能被视为float ***
错误是否不清楚?按照您的想象,float[5][5][5]
与float***
不相关。
改为使用std::vector<std::vector<std::vector<float> > >
,避免整个混乱。
我真的很新C++,只有在java和c的经验,你可以举一个例子使用'std :: vector
@Miranda:我认为这超出了本网站的范围。阅读C++有关向量的书中的章节。 – 2011-04-03 15:12:40
rectest.cpp:在函数'OG * sampleOG1()'中: rectest.cpp:59:error:'newOG'未在此范围内声明 rectest.cpp:63:错误:'occupancyGrid'未在此范围内声明 – Oswald 2011-04-03 14:55:07
我很高兴有一个相关函数(相关性?)。 [这里的初始片段没有问题](http://codepad.org/epbs5Agr)。你确切的问题是什么? – sehe 2011-04-03 14:55:26
@Oswald:报告你自己的编译失败是没有帮助的 – sehe 2011-04-03 14:55:52