инициализировать структуру в структуре инициализации? - PullRequest
4 голосов
/ 09 сентября 2011

Это может звучать несколько глупо, но я должен знать, когда я пишу бинго-доску на 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}
    };
}

Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

Это можно сделать просто как

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.

1 голос
/ 09 сентября 2011

Поскольку структуры являются гражданами первого класса в 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;
}

Что, кажется, то, что вы хотите. Если вы объявляете плату внутри функции, я бы предложил объявить ее статической, потому что вы не изменяете ее, поэтому постоянные изменения в порядке, и функции не нужно увеличивать стек при каждом вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...