2011-12-04 35 views
0

我该怎么做......我需要将一个矩阵传递给函数?将矩阵传递给函数的问题

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

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

+0

你可以像这样'char mm [] [640]''声明参数。这也是可能的 – Yappie

+1

Yappie的评论说明了为什么这不是一个类型安全的方式来声明这个论点。如果你想要一些更安全的类型,你可以使用'void WriteMatrixOut(char(&mm)[480] [640]);'这是一个具有这些尺寸的数组的引用,编译器会在调用函数时检查它。 – 2011-12-04 00:49:57

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; 
相关问题