我有一个tile的结构(所有属性都是以前定义的枚举)
typedef struct {
ShapeType shape;
ColorType color;
PatternType pattern;
IconType icon;
} TileDefinition;
我想创建另一个包含16个tile的结构,用于“board”。像这样:
typedef struct {
TileDefinition[16]
} BoardDefinition;
然后我希望能够像这样循环:
for(int i=0;i<16;i++) {
TileDefinition tileDef = boardDef[i];
// Do something with tileDef
}
但显然BoardDefinition结构的设置不起作用。我怎么设置它?我应该在哪里使用指针?
由于
答案 0 :(得分: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;
}
答案 1 :(得分:0)
选项1:使BoardDefinition
成为Objective-C对象,可以在init
方法中设置它。
选项2:使用(Objective-)C ++并为struct BoardDefinition
提供构造函数。
选项3:与C保持并提供initBoardDefinition(BoardDefinition *boardDef);
功能。
答案 2 :(得分: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。在这种情况下,您必须对类的初始化方法执行类似于以下操作的tileDefinition。
- (id)init
{
if( (self = [super init]) != nil )
{
definition.count = 16;
definition.tileDefinition = malloc( definition.count * sizeof(*definition.tileDefinition);
}
return self;
}