C++ 将矩阵传递到函数中的问题

C++ 将矩阵传递到函数中的问题,c++,C++,我能做什么。。。我需要向函数中传递一个矩阵 error C2664: 'WriteMatrixOut' : cannot convert parameter 1 from 'char [480][640]' to 'char ** ' 指向的类型是不相关的;转换需要重新解释转换、C样式转换或函数样式转换 class Image { public: char mm[480][640]; void WriteMatrixOut(char **mm); } 声明它为void wr

我能做什么。。。我需要向函数中传递一个矩阵

error C2664: 'WriteMatrixOut' : cannot convert parameter 1 from 'char [480][640]' to 'char ** '
指向的类型是不相关的;转换需要重新解释转换、C样式转换或函数样式转换

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

声明它为
void writematrix输出(char-mm[480][640])

将其声明为
void writematrix(char-mm[480][640])取而代之。

char**
char[x][y]
是根本不同的,不能强制转换

当您执行
字符数组[100][100]
时,编译器将在一个位置分配所有内容,而不涉及任何指针。这也相当于:

typedef字符内部数组[100];内阵列毫米[100]

所以它是100块,每块100个字符
sizeof(mm)
将是10000字节,将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;
//命名空间std::tr1::在C++03中,std::在C++11中
typedef阵列矩阵;

char**
char[x][y]
是根本不同的,不能强制转换

当您执行
字符数组[100][100]
时,编译器将在一个位置分配所有内容,而不涉及任何指针。这也相当于:

typedef字符内部数组[100];内阵列毫米[100]

所以它是100块,每块100个字符
sizeof(mm)
将是10000字节,将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;
//命名空间std::tr1::在C++03中,std::在C++11中
typedef阵列矩阵;

您可以这样声明参数
char mm[][640]
。也可能是Appie的评论说明了为什么这不是一种声明此参数的类型安全方法。如果您想要更多的类型安全性,可以使用
void writematrix(char&mm)[480][640])这是对具有这些维度的数组的引用,编译器将在调用函数时对此进行检查。您可以像这样声明参数
char mm[][640]
。也可能是Appie的评论说明了为什么这不是一种声明此参数的类型安全方法。如果您想要更多的类型安全性,可以使用
void writematrix(char&mm)[480][640])这是对具有这些维度的数组的引用,编译器将在调用函数时对此进行检查。