设置指向静态2D数组的指针

时间:2014-05-23 14:39:04

标签: c++ arrays pointers

如何将类中的指针设置为外部静态数据结构?

struct Str {
    double **matr;   // which type should matr be?
    int nx, ny;

    template<size_t rows, size_t cols>
    void Init(double(&m)[rows][cols], int sx, int sy) {
        matr = m;     // <-- error
        nx = sx; ny = sy;
    }
};
...
static double M[3][5] = { { 0.0, 1.0, 2.0, 3.0, 4.0 },
                          { 0.1, 1.1, 2.1, 3.1, 4.1 },
                          { 0.2, 1.2, 2.2, 3.2, 4.2 } };
Str s;
s.Init(M, 3, 5);

使用此代码,我得到以下编译时错误消息(Visual C ++ 2008/2012):

1&GT;错误C2440:&#39; =&#39; :无法转换为&#39; double [3] [5]&#39;到&#39;加倍**&#39;
1 GT;指向的类型是无关的;转换需要reinterpret_cast,C风格的演员或函数式演员 1 GT;参见函数模板实例化&lt; void S :: Init4&lt; 3,5&gt;(double(&amp;)[3] [5],int,int)&#39;正在编制

2 个答案:

答案 0 :(得分:1)

问题是double的2D数组不是指针数组,它只是指向2D数组的第一个元素的单个指针,该数组由几个连续的双行表示。存储器中。

由于您的struct包含字段nx / ny,您只需将数组转换为简单指针,然后使用nx / ny即可访问它,即:

struct Str {
    double *matr;
    int nx, ny;

    void Init(double* m, int sx, int sy) {
        matr = m;
        nx = sx; ny = sy;
    }
};

static double M[3][5] = { { 0.0, 1.0, 2.0, 3.0, 4.0 },
                          { 0.1, 1.1, 2.1, 3.1, 4.1 },
                          { 0.2, 1.2, 2.2, 3.2, 4.2 } };

int main() {
    Str s;
    s.Init(M[0], 3, 5);
    return 0;
}

然后,您必须使用nx / ny来访问数组,例如这是一个可以添加到打印数组的struct Str的函数:

#include <iostream>

void print() {
    for (int i = 0; i < nx; i++) {
        for (int j = 0; j < ny; j++) {
            std::cout << matr[i*ny+j] << " ";
        }
        std::cout << std::endl;
    }
}

另一个(可以说是更好的)解决方案是将模板参数添加到替换struct Str / nx的{​​{1}},然后ny成员可以具有包含尺寸。

答案 1 :(得分:1)

所以,你想要一个指向2D数组的指针。 Str必须是模板,因为它的成员matr的类型取决于该数组的维度。

template<int rows, int cols>
struct Str {
    double (*matr)[rows][cols];

    void Init(double(&m)[rows][cols]) {
        matr = &m;
    }
};

Str<3, 5> s;
s.Init(M);