将矩阵传递给函数的问题

时间:2011-12-04 00:27:41

标签: c++

我能做什么...我需要将矩阵传递给函数?

error C2664: 'WriteMatrixOut' : cannot convert parameter 1 from 'char [480][640]' to 'char ** '

指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换

class Image 
{
public:
    char mm[480][640];
    void WriteMatrixOut(char **mm);
}

2 个答案:

答案 0 :(得分:2)

将其声明为void WriteMatrixOut(char mm[480][640]);

答案 1 :(得分:1)

char**char[x][y]根本不同,无法投射。

执行char array[100][100]时,编译器会将所有内容分配到一个位置,根本不涉及指针。它也是等同的:

typedef char innerArray[100]; innerArray mm[100];

因此每100个字符有100个块。 sizeof(mm)将是一个10,000字节,你可以更好地将mm转换为char*而不是char**

但是,如果使用char**动态分配数组数组,则有一个指向连续指针数组的指针;这些指针引用内存中任意长度的位置。 (这也允许你有锯齿状的数组。)这两个内存布局真的完全不同。

现在,你可能想在参数声明中使用相同的类型:

char mm[100][100];
void writeMatrixOut(char mm[100][100]);

但这不安全,因为C使问题更加混乱。 foo(int x[3])foo(int x[])foo(int *x)都是等效的。我不确定这对嵌套数组是如何工作的,但是在传递参数时,编译器不会检查至少一个数组维。

您可以使用typedef来避免这种情况:

typedef char Matrix[100][100];
Matrix mm;
void writeMatrixOut(Matrix &mm); // might even be 'const Matrix &'

但即使这样,你也无法分配或返回数组。要使数组运行,必须将它们包装在结构或类中:

struct Matrix { char elements[100][100]; }
Matrix mm;
void writeMatrixOut(Matrix &mm); // might even be 'const Matrix &'

C ++ 03 / C ++ 11还包含一个数组<>可以为你做这个的包装类,但是嵌套数组有点笨拙:

// namespace std::tr1:: in C++03, std:: in C++11
typedef array<100, array<100, char>> Matrix;