您好我正在尝试使用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
对这个问题的任何帮助都会很棒。 谢谢 甲
答案 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
类中引用堆栈变量,但我认为你明白了。