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这个函数没有编译错误,但仍导致程序崩溃

+0

rectest.cpp:在函数'OG * sampleOG1()'中: rectest.cpp:59:error:'newOG'未在此范围内声明 rectest.cpp:63:错误:'occupancyGrid'未在此范围内声明 – Oswald 2011-04-03 14:55:07

+0

我很高兴有一个相关函数(相关性?)。 [这里的初始片段没有问题](http://codepad.org/epbs5Agr)。你确切的问题是什么? – sehe 2011-04-03 14:55:26

+0

@Oswald:报告你自己的编译失败是没有帮助的 – sehe 2011-04-03 14:55:52

是的。那将不会编译,因为float[5][5][5]float ***不是相同的类型。它们甚至不是兼容类型。一个不能自动转换为其他。

但是,float[5][5][5]可以自动转换为float (*)[5][5]。因此,这是合法的代码:

float (*m)[5][5]; 
    m = sampleGrid1; //legal - allowed! 

演示:http://ideone.com/RwAwI

所以定义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> > >,避免整个混乱。

+0

我真的很新C++,只有在java和c的经验,你可以举一个例子使用'std :: vector >> – Miranda 2011-04-03 15:01:17

+0

@Miranda:我认为这超出了本网站的范围。阅读C++有关向量的书中的章节。 – 2011-04-03 15:12:40