【问题标题】:How to initialize a 3-dimensional array [duplicate]如何初始化3维数组[重复]
【发布时间】:2014-04-22 03:45:19
【问题描述】:

我正在尝试初始化一个 3-d 数组,但由于某种原因,当我编译时,它给了我很多警告

double array[5][4][1]=
{
  {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12},
    {13,14,15,16},
    {17,18,19,20}
  }
};

给出的警告:

sales.c: In function `main':
sales.c:28: warning: excess elements in array initializer
sales.c:28: warning: (near initialization for `array[0][0]')
sales.c:28: warning: excess elements in array initializer
sales.c:28: warning: (near initialization for `array[0][0]')
sales.c:28: warning: excess elements in array initializer
sales.c:28: warning: (near initialization for `array[0][0]')
sales.c:29: warning: excess elements in array initializer
sales.c:29: warning: (near initialization for `array[0][1]')
sales.c:29: warning: excess elements in array initializer
sales.c:29: warning: (near initialization for `array[0][1]')
sales.c:29: warning: excess elements in array initializer
sales.c:29: warning: (near initialization for `array[0][1]')
sales.c:30: warning: excess elements in array initializer
sales.c:30: warning: (near initialization for `array[0][2]')
sales.c:30: warning: excess elements in array initializer
sales.c:30: warning: (near initialization for `array[0][2]')
sales.c:30: warning: excess elements in array initializer
sales.c:30: warning: (near initialization for `array[0][2]')
sales.c:31: warning: excess elements in array initializer
sales.c:31: warning: (near initialization for `array[0][3]')
sales.c:31: warning: excess elements in array initializer
sales.c:31: warning: (near initialization for `array[0][3]')
sales.c:31: warning: excess elements in array initializer
sales.c:31: warning: (near initialization for `array[0][3]')
sales.c:32: warning: excess elements in array initializer
sales.c:32: warning: (near initialization for `array[0][4]')
sales.c:32: warning: excess elements in array initializer
sales.c:32: warning: (near initialization for `array[0][4]')
sales.c:32: warning: excess elements in array initializer
sales.c:32: warning: (near initialization for `array[0][4]')
sales.c:32: warning: excess elements in array initializer
sales.c:32: warning: (near initialization for `array[0]')

当我通过丢失一对大括号而仅使用二维数组进行初始化时,编译器不会给出这些警告。谁能建议我做错了什么?

【问题讨论】:

  • 您的尺寸显然不正常;从最外层到最里面你有 1、5、4 个初始化器,它们与 [5][4][1] 或 [1][4][5] 都不匹配。

标签: c arrays multidimensional-array


【解决方案1】:

这是在抱怨,因为你说你最里面的数组应该只有一个元素,但你给了它很多。

int a[3][2][1] =                                                        
{                                                                       
    {                                                                   
        {1},                                                            
        {2}                                                             
    },                                                                  
    {                                                                   
        {3},                                                            
        {4}                                                             
    },                                                                  
    {                                                                   
        {5},                                                            
        {6}                                                             
    }                                                                   
}; 

如果您想要更多内部元素,请将您的 1 更改为其他内容。

【讨论】:

    【解决方案2】:

    维度 1 是最奇特的;你也有太多级别的大括号​​:

    double array[5][4][1]=
    {
      // {  These braces mean what follows is meant to initialize array[0], but
      //    there are 5 initializers for the 4 elements in array[0], and there
      //    are 4 initializers for each of the 'size 1' sub-arrays which is why
      //    the compiler complains about too many initializers for array[0][0][0], etc.
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16},
        {17,18,19,20}
      // }
    };
    

    这至少可以编译。完全大括号的版本将在每个数字周围包含一对大括号:

    double array[5][4][1]=
    {
        { {  1 }, {  2 }, {  3 }, {  4 }, },
        { {  5 }, {  6 }, {  7 }, {  8 }, },
        { {  9 }, { 10 }, { 11 }, { 12 }, },
        { { 13 }, { 14 }, { 15 }, { 16 }, },
        { { 17 }, { 18 }, { 19 }, { 20 }, },
    };
    

    即 5 行,每行有 4 个子数组,每个子数组包含一个数字。

    【讨论】:

    • 我认为,OP 更有可能将其声明为 array[1][5][4] 并使用当前的初始化程序。
    • @JimBalter:除了减慢访问速度之外,您为什么要向任何数组添加大小为 1 的维度?如果它是一个具有三个动态维度的数组,那么 1 可能会显示为退化的情况(我不会抱怨),但是对于静态大小的数组,总是必须为与[1] 在数组定义中?也就是说,我注释掉的带有大括号的原始初始化程序将正确初始化int array[1][5][4]。但我认为[1] 只是一个错误。
    • OP 可能有一种适用于 3D 数组的算法,但他的测试数据在一个维度中只有一个实例。对于恒定维数的数组,访问速度不会减慢。 “将正确初始化 int array[1][5][4]”——我没有另外说。 “但我认为 [1] 只是一个错误”——也许,但 OP 明确写了关于初始化 3-d 数组的内容。
    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 2018-12-09
    • 2014-12-09
    • 1970-01-01
    • 2021-11-20
    • 2019-02-10
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多