c样式2d数组不保留函数之间的值

时间:2015-08-08 11:03:11

标签: ios objective-c multidimensional-array

好的,所以我正在使用包含位置结构的c风格的二维数组创建一个地图:

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

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

在我的下一个函数中,我首先打印数组以确保它是相同的,但事实并非如此。 价值观完全不同,阵列甚至缩短了。任何人都可以告诉我为什么我会遇到这个问题。我正在使用结构和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;
}

1 个答案:

答案 0 :(得分:0)

为了将2D数组存储在一个函数的实例变量中并在另一个函数中使用它,您需要将变量声明为数组,而不是指针。分配不起作用,因此您需要使用memcpy初始化数据:

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