(编辑:最后提出可能的解决方案)
我是一名正在学习Objective C开发iPhone应用程序的C / C ++程序员。我将要编写的程序将处理大型的2d对象数组。我已经读过使用NSArray的NSArray并且有一些工作代码,但我正在尝试理解如何使用C样式数组来节省开销并学习你能做什么和不能做什么。
在这个片段中,MapClass只包含两个属性:int x和int y。我有以下代码片段使用静态定义的10x10数组。
MapClass *arr[10][10];
arr[2][3] = [[MapClass alloc] init];
arr[2][3].x = 2;
arr[2][3].y = 3;
NSLog(@"The location is %i %i", arr[2][3].x, arr[2][3].y);
// Output: "The location is 2 3"
这是使用一维数组进行计算并计算单元格基于X和Y的位置的示例:
MapClass **arr = (MapClass**) malloc(10 * 10 * sizeof(MapClass *));
arr[3 * 10 + 2] = [[MapClass alloc] init];
arr[3*10 + 2].x = 2;
arr[3*10 + 2].y = 3;
NSLog(@"The location is %i %i", arr[3*10 + 2].x, arr[3*10 + 2].y);
// Output: "The location is 2 3"
我的问题是这个:我如何将我的数组malloc为二维数组,以便我可以使用arr [2] [3]样式表示法来访问它?
我正在尝试的所有内容都会产生各种错误,例如“下标需要[你的班级]的大小,这在非脆弱的ABI中不是常数”。
任何人都可以给我一个关于如何做到这一点的嗤之以鼻?我一直在阅读和试验,无法弄明白。我的一维数组示例是否有任何错误?
在使用xzgyb的答案愚弄之后,我有以下块工作。有什么问题吗?谢谢!
int dimX = 20;
int dimY = 35;
MapClass ***arr = (MapClass***) malloc( dimX * sizeof(MapClass **));
for (int x = 0; x < dimX; ++x)
{
arr[x] = (MapClass **) malloc( dimY * sizeof(MapClass*));
}
for (int x = 0; x < dimX; ++x)
{
for (int y = 0; y < dimY; ++y)
{
arr[x][y] = [[MapClass alloc] init];
arr[x][y].x = x;
arr[x][y].y = y;
}
}
for (int x = 0; x < dimX; ++x)
{
for (int y = 0; y < dimY; ++y)
{
NSLog(@"%i %i is %i %i", x, y, arr[x][y].x, arr[x][y].y);
}
}
// Cleanup
for (int x = 0; x < dimX; ++x) {
for (int y = 0; y < dimY; ++y) {
[arr[x][y] release];
}
}
for (int x = 0; x < dimX; ++x)
{
free(arr[x]);
}
free(arr);
答案 0 :(得分:1)
经过测试,使用NSMutableString类和各种字符串方法可以正常工作。 我可能建议使用标准消息发送括号,而不是使用较新的点运算符语法,只是为了简化编译器实际上要完成的任务。
如果我理解你的意思,sizeof(ClassName )应该与sizeof([ClassName class])(以及int 或id)相同。您发布的代码不应该给出类似的错误,因为所有指针的大小都相同。现在,如果你尝试了类似sizeof(* someInstanceOfAClass)的东西,那么你会遇到一些问题,因为你试图使用足够大的内存以适应10 * 10 *(对象的实际大小),这不是你想要的去做。 (听起来就像你的警告一样。)
答案 1 :(得分:1)
尝试以下代码:
MapClass ***arr = (MapClass***) malloc(10 * 10 * sizeof(MapClass *));
for ( int row = 0; row < 10; ++row ) {
arr[ row ] = (MapClass **)&arr[ row * 10 ];
}
arr[0][1] = [[MapClass alloc] init];
arr[1][2] = [[MapClass alloc] init];