传递矩阵到函数的问题

Issue with passing a matrix into a function

本文关键字:函数 问题      更新时间:2023-10-16

我能做什么…我需要传递一个矩阵到函数中?

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);
}

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

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;