(编辑:把可能的解决方案放在最后)
我是一名 C/C++ 程序员,正在学习 Objective C 来开发 iPhone 应用程序。我将要编写的程序将处理大型二维对象数组。我已经阅读了关于使用 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);