【问题标题】:Array of array of struct in C [duplicate]C中结构数组的数组[重复]
【发布时间】:2022-01-10 10:13:23
【问题描述】:

我想创建一个结构数组的数组。这里的错误在哪里?实际上,我有 2 个具有 4 个状态(模式)和 3 个参数(a、b、c)的 LED。 提前谢谢你。

typedef struct {
    int a;
    int b;
    int c;
}CfgType;


CfgType Led[4][2];


Led[4][0]=
{   
    /*    Pattern         a           b      c  */
/*00*/    /*STATE0*/ {    5    ,    100 ,    2  },
/*01*/    /*STATE1*/ {    5    ,    100 ,    1  },                                                                                                                                                                                                                                                                  
/*02*/    /*STATE2*/ {   100   ,    100 ,    0  },                                                                                                                  
/*03*/    /*STATE3*/ {   100   ,    100 ,    0  },                                                                                                                                          
};


Led[4][1]=
{   
    /*    Pattern         a           b      c  */
/*00*/    /*STATE0*/ {    5    ,    100 ,    2  },
/*01*/    /*STATE1*/ {    5    ,    100 ,    1  },                                                                                                                                                                                                                                                                  
/*02*/    /*STATE2*/ {   100   ,    100 ,    0  },                                                                                                                  
/*03*/    /*STATE3*/ {   100   ,    100 ,    0  },                                                                                                                                          
};

【问题讨论】:

  • 您不能将任何内容分配给数组。尝试用这些值来初始化它。由于您没有完整的 sn-p,因此无法看到这些部分是否靠近在一起(即紧邻定义的分配者)或位于某些单独的位置。
  • 您可以将数组视为有 4 行 2 列。这些行位于偏移量 0、1、2 和 3。Led[4] 是偏移量 4,它在数组之外。

标签: arrays c struct


【解决方案1】:

您不能将任何内容分配给数组。尝试用值来初始化它。

除了那个元素Led[4] 不存在。最大索引为3

您还切换了数组的维度。您似乎想要 2 个元素包含 4 个结构元素。

如下所示:

typedef struct {
    int a;
    int b;
    int c;
} CfgType;


CfgType Led[2][4] =
{
[0] = {
    [0] = { .a =   5, .b = 100, .c = 2 },
    [1] = { .a =   5, .b = 100, .c = 1 },
    [2] = { .a = 100, .b = 100, .c = 0 },
    [3] = { .a = 100, .b = 100, .c = 0 }
      },
[1] = {
    [0] = { .a =   5, .b = 100, .c = 2 },
    [1] = { .a =   5, .b = 100, .c = 1 },
    [2] = { .a = 100, .b = 100, .c = 0 },
    [3] = { .a = 100, .b = 100, .c = 0 }
      }
};

这个例子使用了指定的初始化器,这使得它可以抵抗在两者之间添加新值或重新排序

【讨论】:

  • 我不知道指定的初始化程序语法。感谢分享,酷!
  • 它们是用 C99 引入的,我认为它们确实是个好东西。
  • 它使代码更加冗长,但我认为它们很棒,因为当你明确表达时,更难自取其辱。
  • 没错,你并不真的需要将它用于数组索引,但对于结构成员来说,它们值得额外输入。
【解决方案2】:

首先,交换声明中的数组大小。它们应该颠倒过来。 然后,您可以跳过分配并直接初始化数组,如下所示:

typedef struct {
    int a;
    int b;
    int c;
}CfgType;

CfgType Led[2][4] = {
    {   
        /*    Pattern         a           b      c  */
    /*00*/    /*STATE0*/ {    5    ,    100 ,    2  },
    /*01*/    /*STATE1*/ {    5    ,    100 ,    1  },                                                                                                                                                                                                                                        >
    /*02*/    /*STATE2*/ {   100   ,    100 ,    0  },
    /*03*/    /*STATE3*/ {   100   ,    100 ,    0  },
    },
    
    {   
        /*    Pattern         a           b      c  */
    /*00*/    /*STATE0*/ {    5    ,    100 ,    2  },
    /*01*/    /*STATE1*/ {    5    ,    100 ,    1  },                                                                                                                                                                                                                                        >
    /*02*/    /*STATE2*/ {   100   ,    100 ,    0  },
    /*03*/    /*STATE3*/ {   100   ,    100 ,    0  },
    }
};

我用 gcc 编译,效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多