сеттер объектива-c 2d-массив - PullRequest
2 голосов
/ 10 марта 2009

я хочу инициализировать 2d массив .. но мой код не работает,

Может кто-нибудь сказать мне, что не так?

Спасибо Chris

@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)

Ответы [ 3 ]

4 голосов
/ 10 марта 2009

также

int mapData[8][8];

и

int **mapData;

интерпретируется по-разному. Первый будет массивом с 64 последовательными целыми числами, а другой - указателем на указатель на 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
2 голосов
/ 10 марта 2009

Я не думаю, что вы можете иметь свойства типов массивов. Можете ли вы просто использовать вместо этого геттер / сеттер? Например:

@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
0 голосов
/ 10 марта 2009

Синтезирующему оператору свойства не нужно указывать тип, только имя.

Итак,

@synthesize mapData;

Кроме того, поскольку mapData является переменной экземпляра, вам не нужно использовать синтаксис «self.mapData». Вы могли бы просто сделать;

mapData[i][j] = map[i][j];

Наконец, осознайте, что это просто блоки данных, поэтому вы можете скопировать все за один раз. * 1009 например *

// could also be sizeof(mapData) but this is more instructive
memcpy(mapData, map, sizeof(int) * 8 * 8); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...