Monday, April 25, 2011

objective-c setter 2d-array

Hi,

i want to initialize a 2d array.. but my code doesn`t work,

can somebody tell me what is wrong?

Thanks 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.......)

Edit: if i remove the type at synthesize as suggested, the compiler tells me another error:error type of property mapData does not match type of ivar mapData

Edit#2: can somebody please post the corrected code? i´m working at this really silly problem for over an hour.. (no c/c++ background, but java)

From stackoverflow
  • The synthesize statement of a property does not need to specify the type, just the name.

    So;

    @synthesize mapData;
    

    Also because mapData is an instance variable you do not need to use the "self.mapData" syntax. You could just do;

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

    Finally, realise that these are just blocks of data so you can copy everything in one go. E.g

    // could also be sizeof(mapData) but this is more instructive
    memcpy(mapData, map, sizeof(int) * 8 * 8);
    
    chrisx : okay, i now removed they type information.. now i get the error: error type of property mapData does not match type of ivar mapData
  • also

    int mapData[8][8];
    

    and

    int **mapData;
    

    is interpreted differently. The first will be an array with 64 consecutive ints and the other a pointer to a pointer to an int.

    Maybe this can work for you, wrapping the 2d array in a struct...

    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
    

    Rewritten a little to show a map initializer

    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
    
    chrisx : i think i want the first thing.. not the pointer vector.. what do i have to do to change id?
    chrisx : and how would i define a map_t int the code? 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} } throws hundrets of errors :-(
    epatel : what does the errors say? any error prior? because that works fine here...
    chrisx : got it working now, i think it was some stupid syntax error :-). thanks a lot for your help! have a nice day :-)
  • I don't think you can have properties of array types. Can you just use a getter/setter instead? For example:

    @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 comments:

Post a Comment