我想初始化一个二维数组..但我的代码不起作用,
有人可以告诉我出了什么问题吗?
由于 克里斯
@interface Map : NSObject {
int mapData[8][8];
}
@property(readwrite) int** mapData;
@end
@implementation Map
@synthesize **mapData; (Error: Syntax before *)
- (id)initWithMap:(int[8][8])map {
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) {
self.mapData[i][j] = map[i][j];
}
}
return self;
}
@end
(Warning mapData requires method... use @synthesize or.......)
编辑:如果我按照建议删除了合成类型,编译器会告诉我另一个错误:属性mapData的错误类型与ivar mapData的类型不匹配
编辑#2:有人可以发布更正后的代码吗?我正在处理这个非常愚蠢的问题超过一个小时..(没有c / c ++背景,但是java)
答案 0 :(得分:4)
也
int mapData[8][8];
和
int **mapData;
的解释不同。第一个是一个包含64个连续int的数组,另一个是指向int的指针。
也许这对您有用,将2d数组包装在结构中......
struct map_s {
int map[8][8];
};
typedef struct map_s map_t;
@interface Map : NSObject {
map_t mapData;
}
@property (nonatomic, readwrite) map_t mapData;
@end
@implementation Map
@synthesize mapData;
- (id)initWithMap:(map_t)map {
int i, j;
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
self.mapData.map[i][j] = map.map[i][j];
}
}
return self;
}
@end
重写一下以显示地图初始化程序
struct map_s {
int map[8][8];
};
typedef struct map_s map_t;
@interface Map : NSObject {
map_t mapData;
}
@property (nonatomic, readwrite) map_t mapData;
- (void)init;
- (id)initWithMap:(map_t)map;
@end
@implementation Map
@synthesize mapData;
- (void)init
{
map_t first = {
{
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0 }
}
};
[self initWithMap:first];
}
- (id)initWithMap:(map_t)map {
mapData = map;
return self;
}
@end
答案 1 :(得分:2)
我认为你不能拥有数组类型的属性。你可以只使用一个吸气剂/设定器吗?例如:
@interface Map : NSObject {
int mapData[8][8];
}
- (int)getI:(int)i j:(int)j;
- (int)setI:(int)i j:(int)j to:(int)v;
@end
@implementation Map
- (id)initWithMap:(int[8][8])map {
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) {
mapData[i][j] = map[i][j];
}
}
return self;
}
- (int)getI:(int)i j:(int)j {
return mapData[i][j];
}
- (void)setI:(int)j j:(int)j toValue:(int)v {
mapData[i][j] = v;
}
@end
答案 2 :(得分:0)
属性的synthesize语句不需要指定类型,只需要指定名称。
因此;
@synthesize mapData;
另外因为mapData是一个实例变量,所以不需要使用“self.mapData”语法。你可以做;
mapData[i][j] = map[i][j];
最后,要意识到这些只是数据块,因此您可以一次性复制所有内容。 E.g
// could also be sizeof(mapData) but this is more instructive
memcpy(mapData, map, sizeof(int) * 8 * 8);