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])改为code>。将其声明为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])代码>这是对具有这些维度的数组的引用,编译器将在调用函数时对此进行检查。