2015-08-08 34 views
0

好了,所以我使用的是含有位置结构C风格的二维数组创建地图:空调风格二维数组没有保留价值

typedef struct{ 
    int x; 
    int y; 
} posn; 

我上传的价值观罚款并打印出来,以确保值是正确的。 2d数组作为实例变量存储在我的类中。

在我的下一个函数中,我首先打印数组以确保它是相同的,但事实并非如此。 值完全不同,数组甚至缩短。任何人都可以告诉我为什么我得到这个问题。我使用的是structs和c风格的数组,因为我设计的是一个游戏,我想他们会比NSMutableArray更快。

这是我的填充阵列

mapa_camino = (posn *)malloc(w * h * sizeof(posn)); 

int i, j = 0; 
for (i = 0; i < w; i++){ 
    for (j = 0; j < h; j++){ 
     SKNode *act; 
     act = [self.main_view nodeAtPoint:CGPointMake(i-algorimo_compensado.x, j-algorimo_compensado.y)]; 
     if([act isKindOfClass:[BasicActor class]] && ![act isKindOfClass:[CMActor class]]){ 
      //crea pt 
      posn pt = {.x = i, 
       .y = j, 
       .ocupado = YES, 
       .visitado = NO}; 
      //fija posicion actual como pt 
      *(mapa_camino + i*h + j) = pt; 
     }else{ 
      posn pt = {.x = i, 
       .y = j, 
       .ocupado = NO, 
       .visitado = NO}; 
      *(mapa_camino + i*h + j) = pt; 
     } 

    } 
} 

这是我的打印:

- (NSMutableArray*) printtwodarray:(posn*)matriz{ 
    int array_w = self.frame.size.width; 
    int array_h = self.frame.size.height; 
    NSMutableArray* regresa_matriz = [[NSMutableArray alloc] initWithCapacity:array_w]; 
    for(int i=0;i<array_w;i++){ 
     [regresa_matriz addObject:[[NSMutableArray alloc] initWithCapacity:array_h]]; 
     for(int j=0;j<array_h;j++){ 
      posn *pt = (matriz + i*array_h + j); 
      [[regresa_matriz objectAtIndex:i] insertObject:[[Posn alloc] initWithX:pt->x Y:pt->y H:pt->h G:pt->g Ocupado:pt->ocupado Goal:pt->is_goal] atIndex:j]; 
     } 
    } 
    return regresa_matriz; 
} 
+3

你可以发布你如何填充数组,以及如何使用它进行打印? – Glorfindel

+1

你是否在你的函数中创建一个C数组,然后试图将它作为返回值传递出函数? –

+0

不,我将数组存储为一个实例变量,然后在我的后续函数中访问它。 –

回答

0

为了存储从一个功能中的实例变量的2D阵列,并用它在另一个需要将变量声明为数组的函数,而不是指针。分配是行不通的,所以你需要用memcpy初始化数据:

@interface Foo : NSObject { 
    posn p[20][30]; 
} 
@end 
... 
-(void)bar { 
    posn d[20][30] = {{...}, {...},...,{...}}; 
    memcpy(p, d, sizeof(p)); 
}