代码之家  ›  专栏  ›  技术社区  ›  Anthony McCormick

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

  •  2
  • Anthony McCormick  · 技术社区  · 16 年前

    嗨,我正在尝试初始化一个具有双值的对象,格式为double filter[3][3]; 但我不断地得到以下错误。

    我的头上有这个

    @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
    

    在这个问题上的任何帮助都是惊人的。 A

    3 回复  |  直到 16 年前
        1
  •  0
  •   Carl Norum    16 年前

    二维数组和指针对指针不是一回事。你有两个选择-改变 filter 类以包含二维数组,或者将初始化更改为使用指向指针的指针。

    在选项1中,您可以在 滤波器 实例,而不是仅仅拿着指针。您需要更改类接口:

    @interface filter : NSObject
    {
        double matrix[3][3];
    }
    
    -(id)initWithMatrix:(double[3][3])filterMatrix;
    

    那么你的执行 initWithMatrix: 我可以做一个 memcpy()

    选择2有点不同。保持其他代码的原样,但更改 滤波器

    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() 所有这些数组,否则您将在 滤波器 同学们,但我想你们明白了。

        2
  •  1
  •   Lily Ballard    16 年前

    那是因为 double** double[*][*] 双[*][*] 是无效类型,因为它未定义跨距。 双倍** 是指向一个double的指针,换句话说,是指向一个double数组的指针。你应该用 double* 就像你喜欢的类型。

    编辑 double[*][3] 仍然只是一个双倍数组,即使它有两个维度。这仍然相当于 .

        3
  •  0
  •   Jesse Naugher    16 年前

    将方法声明设置为

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

    这会将指向数组(2d)的指针传递给方法。 编辑:缺少分号。