【问题标题】:3d array c/c++ initialization/conversion3d 数组 c/c++ 初始化/转换
【发布时间】:2011-04-03 14:49:34
【问题描述】:
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;

相关功能:

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;
}

我想将一些示例网格硬编码到代码中,但不知道创建它们的最佳方法,我必须使用 for 循环吗?

如果可能,我不想更改我的 typedef struct 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这个函数没有编译错误,但还是会导致程序崩溃

【问题讨论】:

  • rectest.cpp:在函数“OG* sampleOG1()”中:rectest.cpp:59:错误:“newOG”未在此范围内声明 rectest.cpp:63:错误:“occupancyGrid”未在此范围内声明
  • 我很高兴有一个相关的功能(相关性?)。 No problem with the initial snippet here。您的确切问题是什么?
  • @Oswald:报告您自己的编译失败几乎没有帮助

标签: c++ c initialization multidimensional-array


【解决方案1】:

是的。这不会编译,因为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 &

【讨论】:

    【解决方案2】:

    错误不是很明显吗? float[5][5][5]float*** 的相关性并不像您想象的那样。

    改用std::vector&lt;std::vector&lt;std::vector&lt;float&gt; &gt; &gt; 并避免整个混乱。

    【讨论】:

    • 我是c++新手,只有java和c方面的经验,你能举个例子std::vector&lt;std::vector&lt;std::vector&lt;float&gt; &gt; &gt;
    • @Miranda:我认为这超出了本网站的范围。阅读 C++ 书中有关向量的章节。
    【解决方案3】:

    float x[2][2] 是一个二维浮点数组——它不是一个一维浮点指针数组。从数组到指针的转换仅适用于此类数组的第一维。

    给定float x[2][2],您为 4 个浮点数保留空间。另一方面,float ** 变量是 指向指针的指针 指向浮点数 - float x[2][2] 中的任何地方都没有指针

    3D 数组当然也是如此——你的 3D 数组里面没有偷偷地隐藏的指针,它不能被视为float ***

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2018-04-05
      • 2013-05-10
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多