【问题标题】:initialize a struct within a struct initialization?在结构初始化中初始化结构?
【发布时间】:2011-09-09 04:52:55
【问题描述】:

这听起来可能有点愚蠢,但我必须知道,因为我正在用 C 编写宾果板。

#include <stdio.h>
typedef struct {
    int a;
    int b;
    int c;
    int d;
    int e;
} row;

typedef struct {
    row one;
    row two;
    row three;
    row four;
    row five;   
} bingo_board;

void initialize_columns()
{
    bingo_board board = {
    .one = {1, 2, 3, 4, 5},
    .two = {6, 7, 8, 9, 10},
    .three = {11, 12, 13, 14, 15},
    .four = {16, 17, 18, 19, 20},
    .five = {21, 22, 23, 24, 25}
    };
}

这可能吗?

【问题讨论】:

  • typedef struct { int cells[5][5]; } bingo_board; 是一种更加循环友好的数据结构。
  • C 的新手。我认为它是一个数组,但你认为你可以更明确一点吗?谢谢。
  • 它是一个二维整数数组(五个元素乘五个元素)。一个名为 xbingo_board 可以作为 x.cells[row][column] 访问。这比必须为每行或每列编写单独的案例更容易在循环中处理。在您的实现中,您必须为x.one.ax.four.a 编写单独的代码(您必须编写至少十个案例,每一行和每列一个)。

标签: c struct


【解决方案1】:

可以这么简单地完成

void initialize_columns()
{
    bingo_board board = {
      {1, 2, 3, 4, 5},
      {6, 7, 8, 9, 10},
      {11, 12, 13, 14, 15},
      {16, 17, 18, 19, 20},
      {21, 22, 23, 24, 25}
    };
}

甚至像

void initialize_columns()
{
    bingo_board board = {
      1, 2, 3, 4, 5,
      6, 7, 8, 9, 10,
      11, 12, 13, 14, 15,
      16, 17, 18, 19, 20,
      21, 22, 23, 24, 25
    };
}

无需“标记”每一行。标记语法在 C99 中可用,并且您在示例中的内容对于 C99 已经正确。

【讨论】:

    【解决方案2】:

    因为结构是 c 中的一等公民,所以赋值是明确定义的,这可以让你

    static bingo_board initial_board = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15},
        {16, 17, 18, 19, 20},
        {21, 22, 23, 24, 25}
    };
    
    
    void init_board(bingo_board *b)
    {
        *b = initial_board;
    }
    

    这似乎是你想要的。如果您确实在函数中声明了板,我建议将其声明为静态,因为您不修改它,因此可以进行持久更改,并且函数不必在每次调用时都增加堆栈。

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多