2

我是一个OOP的初学者,所以这可能是一个愚蠢的问题!未指定大小的多维数组作为实例变量?

我想用多维CARRAY作为一个Objective-C类的实例变量,并且也希望能够指定它的大小在运行时,对象初始化方法中:

@interface ArrayClass : NSObject { 

int array[][]; 

} 

-(id)initWithSizeX:(int)sizeX sizeY:(int)sizeY; 

@end 

这会产生错误“实例变量”数组'具有未知大小。“

我似乎只能使用数组,如果我声明它具有初始大小,例如[20] [20]例如 - 但这当然击败了点,因为我希望它在运行时决定!

我的猜测是,这是必要的,因为物体内存占用需要事先知道吗?

有没有人知道我是否可以尝试这种方式?是否有任何解决方法可以让我在运行时调整数组的大小?还是我完全用错误的方式去解决这个问题?

我知道有很多关于多维数组的主题,但我似乎无法找到任何回答我的问题的东西!

+0

如果它需要是动态的,那么也许做到这一点。 [NSMutableArray](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html)可能会给你你正在寻找的东西,而留在Obj-C土地。您可能需要通过索引算术来完成多维度的工作,但这在两个维度上足够简单。它有*是否是C阵列? – WhozCraig

回答

3

由于您在Objective-C中工作,您可能会考虑使用NSArray(或NSMutableArray,具体取决于您计划如何处理数组)。这会让你发送它的Objective-C消息,并且由于它是一个对象而不是一块内存(因为数组在C中),所以它可以免费获得更多的功能。另外,如果您使用ARC或垃圾收集,它会为您管理内存。

但是如果你知道你想要使用C数组(这是完全有效的),那么你需要在你的代码中使用malloc它(和free),就像你通常在C.(你只能得到解决这个当您创建在编译时规定尺寸的静态数组,正如你指出。)

编辑:作为@Mahesh在评论中指出的,你会想声明您array变量
int **array;
而不是
int[][] array;

看一看here如果你需要更多的帮助,这个!

+1

+1如果OP需要走C路,那么'int **'是需要的。 – Mahesh

+0

谢谢,我会试试看看它是怎么回事!我没有想到这样做。试图让我的头脑围绕面向对象编程正在让我忘记我应该了解的关于C的东西,我想!我宁愿使用C数组,因为我只需要基本功能,而且我担心一些有关性能的影响,即如果我的数组非常大,创建太多NSNumber对象可能会导致性能下降。 – tom1990

+0

是的,如果你所需要做的只是存储一个二维的int数组,那么必须将它们推入到NSNumber对象中才能将它们保存在一个NSArray中 - 这是一个计划'ole C array是正确的选择! – smileyborg

2

如果可能,请使用NSArray或衍生物。如果它必须是一个C数组,你可以用一个单线性malloc()来完成,然后对这两个维度进行算术运算。即

int *ar = malloc(sizeof(int) * nrows * ncols); 

而由偏移

// access cell at [n,m] 
ar[n*ncols+m] = value; 

的算术访问相应的“细胞”总的来说,我发现不是自己管理的指针数组值数组简单这是个糟糕很多,但您的里程可能变化。

或者,如果您想要多维度动态数组中的真正'多维',而不需要进行行malloc-happy列表最常见的建议,我将它保存为最后一个,并且您的C编译器支持C99标准中定义的可选特性称为VLA(可变长度阵列)。C99在实现级支持可变数组声明(即编译器可以支持标准定义的特性,但不一定要参见C99标准的6.7.6.2以获取更多信息)。如果你的编译器不支持它,那么必须定义一个预定义的宏,并且可以在编译时测试(参见C99标准的第6.10.8.3-1节)。这就是说,我在过去十年中曾经使用过的每个符合C99标准的编译器都支持它,所以如果您的编译器不支持,请在下面的评论中告诉我们。对于OP,如果你在Xcode中使用gcc或llvm,我保证你会这么做。对于其他人,只需测试是否定义了__STDC_NO_VLA__。如果是不是,则支持功能

int nrows = 10, ncols = 15; 
int (*ar)[cols] = malloc(sizeof(int) * nrows * ncols); 

请注意一些事情马上。分配与完全相同与以前相同。然而,声明的变量稍有不同。 ar这里的声明规定它是一个指向整数数组的指针。只要你分配的ncols倍数生成的矩阵是现在你已经成长为爱所熟悉的下标访问(这是我们通过nrows乘以做):

// for any n'th row, m'th column 
ar[n][m] = value; 
+0

谢谢您的回复!实际上,我喜欢这种方法,但我从来没有想过尝试以这种方式实现多维数组......而且它的确看起来好像管理起来会更简单! – tom1990

+0

@ tom1990只要你在访问之前检查你的[n,m]值(0 <= n WhozCraig