我有以下代码可以正常工作......
int testarr[3][3] = {
{1,1,1},
{1,0,1},
{1,1,1}
};
[self testCall: testarr];
调用此功能:
- (void)testCall: (int[3][3]) arr {
NSLog(@"cell value is %u",arr[1][1]);
}
我需要数组的长度可变 - 声明函数的最佳方法是什么?
使用空格不起作用:
- (void)testCall: (int[][]) arr {
感谢您的帮助。
答案 0 :(得分:6)
我会把它写成:
- (void) testCall: (int *) aMatrice;
这样做可以避免多个mallocs和数学计算基于x,y坐标的线性数组中的单个偏移量在2D数组中是微不足道的。它还避免了int **隐含的多个mallocs以及该语言延续的2D数组语法的局限性。
所以,如果你想要一个4x5阵列,你可能会这样做:
#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)
int *myArray = malloc(sizeof(int) * 5 * ELEMS_PER_ROW);
然后,您可以线性地或使用嵌套for循环初始化数组:
for(int x=0; x<width; x++)
for(int y=0; y<height; y++)
myArray[INDEXOF(x,y)] = ... some value ...;
你会把它传递给像:
这样的方法[foo testCall: myArray];
虽然您可能还希望同时携带宽度和高度,或者更好的是,创建一个NSObject的IntMatrix子类,它将所有指针算术和存储包装在一个漂亮的干净API之外。
(所有代码都输入SO)
答案 1 :(得分:3)
C数组不能在多个维度上变量。
你不能拥有这个:
int testarr[][] = {
{1,1,1},
{1,0,1,2},
{1,1}
};
但你可以这样:
int testarr[][3] = {
{1,1,1},
{1,0,1},
{1,1,1},
{4,5,6},
{7,8,9}
}
foo(testarr);
void foo(int param[][3])
{
printf("%d", param[3][1]); // prints 5
}
答案 2 :(得分:2)
您无法使用int[][]
,因为第二个维度的大小会影响数组在内存中的布局方式。如果您知道第二个维度,则可以使用int[][x]
,否则您将必须使用int**
,这可以像数组一样进行访问。
答案 3 :(得分:1)
为什么不将NSArray
或NSMutableArray
与NSInteger
一起使用?这些数组类的长度可变,而且更容易使用。
这会导致
- (void)testCall: (NSArray *) arr {
NSLog(@"cell value is %u", [[arr objectAtIndex:1] objectAtIndex:1]);
}
(当然,您还必须使用NSArray定义testarr。)
如果确实想要使用C数组,那么使方法参数成为指向int的指针
- (void)testCall: (int*) arr {
可能会起作用(其余代码保持不变)。
答案 4 :(得分:0)
呼叫
int testarr[3][3] = {
{1,1,1},
{1,0,1},
{1,1,1}
};
[self testCall: (int *)testarr];
功能
- (void)testCall: (int *) arr
{
int (*V_arr)[3] = (int(*)[3])arr;
NSLog(@"cell value is %u",V_arr[1][1]);
}