在Objective C中传递一个可变长度的int数组作为函数参数

时间:2009-09-09 21:38:36

标签: objective-c arrays function parameters

我有以下代码可以正常工作......

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 { 

感谢您的帮助。

5 个答案:

答案 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)

为什么不将NSArrayNSMutableArrayNSInteger一起使用?这些数组类的长度可变,而且更容易使用。

这会导致

- (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]);
}