1

我有一个瓷砖结构(所有属性都是先前定义的枚举)

typedef struct {
    ShapeType shape;
    ColorType color;
    PatternType pattern;
    IconType icon;
} TileDefinition;

我想为“板”创建另一个包含 16 个图块的结构。像这样的东西:

typedef struct {
    TileDefinition[16]

} BoardDefinition;

然后我希望能够遍历它,如下所示:

for(int i=0;i<16;i++) {
    TileDefinition tileDef = boardDef[i];
    // Do something with tileDef
}

但显然 BoardDefinition 结构的设置不​​起作用。我该如何设置?我应该和不应该在哪里使用指针?

谢谢

4

3 回答 3

1

这实际上是一道 C 题。

这一点很好:

typedef struct {
    ShapeType shape;
    ColorType color;
    PatternType pattern;
    IconType icon;
} TileDefinition;

在这里,您需要声明BoardDefinition为:

enum { BoardDefinition_NTiles = 16 }; // << declare a constant for your ease of use
typedef struct {
    TileDefinition tile[BoardDefinition_NTiles];
} BoardDefinition;

然后遍历它们:

// Given:
BoardDefinition boardDef;

for (size_t i = 0; i < BoardDefinition_NTiles; i++) {
    TileDefinition* const tile = &boardDef.tile[i]; // << get a reference to a tile
    // member access of the referenced tile:
    tile->color.red = 1;
}

您编写的版本会创建磁贴的副本:

for (size_t i = 0; i < BoardDefinition_NTiles; i++) {
    TileDefinition tile = boardDef.tile[i]; // << creates a copy of the tile, local to the loop body
    // member access of the copied tile:
    tile.color.red = 1;
}
于 2013-05-17T08:43:11.767 回答
0

正如 trojanfoe 建议的那样,这些作为 Objective-C 对象会更好,但如果由于某种原因你不会这样做。例如,您可能希望在某个类中声明一个 BoardDefinition 类型的实例变量

@interface MyClass : NSObject
{
    BoardDefinition    definition;
}

你的 BoardDefinition 也是错误的,它应该是这样的

typedef struct {
    TileDefinition      boardDef[16];

} BoardDefinition;

您的循环将类似于

for(int i=0;i<16;i++) {
    TileDefinition tileDef = definition.boardDef[i];
    // Do something with tileDef
}

您不需要使用指针放置在父结构中的 TileDefinition 中,例如

typedef struct {
    TileDefinition    * tileDefinition;
    NSUInteger        count;
} BoardDefinition;

这样,您可以拥有可变数量的 TileDefinition。在这种情况下,您必须为类 init 方法分配 tileDefinition 如下所示。

- (id)init
{
    if( (self = [super init]) != nil )
    {
        definition.count = 16;
        definition.tileDefinition = malloc( definition.count * sizeof(*definition.tileDefinition);
    }
    return self;
}
于 2013-05-17T07:49:01.753 回答
0

选项 1:BoardDefinition创建一个可以在方法中设置的 Objective-C 对象init

选项 2:使用 (Objective-)C++ 并为struct BoardDefinition.

选项 3:与 C 保持一致并提供一个initBoardDefinition(BoardDefinition *boardDef);函数。

于 2013-05-17T07:18:53.237 回答