如何将double [] []传递给方法调用?

时间:2010-07-09 21:57:05

标签: iphone objective-c

您好我正在尝试使用double filter [3] [3]格式初始化一个具有double值的对象; 但我不断收到以下错误。

无法在作业中将'double [3] [3]'转换为'double'。

在我的标题中我有这个

@interface filter : NSObject
{
    double **matrix;
}
@property(nonatomic)double **matrix;
-(id)initWithMatrix:(double**)filterMatrix;
在我的班级里面,我有这种方法。

-(id)initWithMatrix:(double**)filterMatrix
{
    matrix = filterMatrix;
    return self;
}

我试图这样称呼它。

double filter[3][3] = {0,0,0,0,1,0,0,0,0};
MyMatrix *myMatrix = [[MyMatrix alloc] initWithMatrix:filter];

我现在收到错误。

Error: Cannot convert double[*][3] to double** in argument passing

对这个问题的任何帮助都会很棒。 谢谢 甲

3 个答案:

答案 0 :(得分:1)

那是因为double**不等同于double[*][*]。事实上,double[*][*]是一种无效的类型,因为它使得步幅未定义。 double**是指向double的指针,或者换句话说,它是指向double数组的指针。您应该使用double*作为您的类型。

编辑:为了澄清,double[*][3]仍然只是一个双打数组,即使它有2个维度。这仍然相当于double*

答案 1 :(得分:0)

当你的方法签名要求一个double(一个像34.2这样的原语)时,你作为参数传递一个double 2d数组(double [] [])。 将方法声明设置为

- (id)initWithMatrix:(double*) matrix;

这会将指向您的数组(2d)的指针传递给该方法。 编辑:错过了分号。

答案 2 :(得分:0)

二维数组与指向指针的指针不同。您有两个选择 - 更改filter类以包含2D数组,或更改初始化以使用指针指针。

在#1选项中,您可以在filter实例中保留数组的副本,而不是仅仅持有指针。您需要更改类接口:

@interface filter : NSObject
{
    double matrix[3][3];
}

-(id)initWithMatrix:(double[3][3])filterMatrix;

然后,initWithMatrix:的实施可以只执行memcpy()或等效操作,将数据复制到您的实例中。

选择#2有点不同。保持其他代码不变,但更改filter的初始化:

double row0[3] = {0,0,0};
double row1[3] = {0,1,0};
double row2[3] = {0,0,0};
double **filter[3] = { row0, row1, row2 };

malloc()所有这些数组可能更安全,因为否则你最终会在filter类中引用堆栈变量,但我认为你明白了。