2013-01-09 45 views
0

当我有这样的构造:错误设置二维数组二维数组

Transform::Transform(float matrix[4][4]) 
{ 
    m = matrix; 
} 

而这个类的定义:

class Transform 
{ 
    float m[4][4]; 
public: 
    Transform(); 
    Transform(float matrix[4][4]); 

但是,这并不编译。

出了什么问题?

错误1错误C2440:'=':无法从'float [] [4]'转换为'float [4] [4]'c:\ Users \ Josh \ Documents \ agui \ trunk \ src \ Agui \ Transform.cpp 75

感谢

+2

如果你可以使用它,我会推荐'std :: array'。它确实分配。 – chris

+3

数组不能以这种方式复制。你需要复制*内容*(通过索引访问或像std :: copy(),memcpy()或memmove()这样的内存移动算法。当然,保护所有内容并执行chris上面说的,用你的stdlib,什么吃晚餐 – WhozCraig

回答

4

如果您使用的是C++ 11尝试改变float matrix[4][4]std::array<std::array<float,4>,4>

这是一个拗口,但它支持这样的操作,C数组本身不支持。

你可以这样做来清理语法。现在

typedef std::array<std::array<float,4>,4> Matrix; 

你可以,如果你不使用C++ 11做

Matrix myMatrix; 

P.S,你可以使用vector,而不是array。它与数组有点不同,但也增加了更多功能,并且在设置访问权限后,它是相同的。

+0

用typedef,所以它不是一口。 – Pubby

+0

@Pubby,它是C++ 11无论如何.' template using array4 = std :: array ;': )取决于你使用它时的变化,真的。 – chris

+0

@Pubby非常真实,我已经添加了它 –

3

KARTHIK的答案是优秀的,或者,你也可以做......

for(int i = 0; i < 4; i++) 
    { 
    for(int j = 0; j < 4; j++) 
     { 
     m[i][j] = matrix[i][j]; 
     } 
    } 

其原理是WhozCraig在评论中提到的相同。

1

即使您将构造函数的参数声明为float matrix[4][4],编译器也会忽略第一个4

+0

我想那么它认为它是浮动* [4] – jmasterx

+0

@Milo你将需要问一个语言纳粹的'float [] [4]'之间的区别错误信息)和'float * [4]'。我通常把它们当作同样的东西(这在技术上可能不准确)。 –

+0

不是lang-nazi,但是你知道,float(*)[4]'。使用变量decl时,它会是'float(* ar)[4]'。它的第一个维度(高级昏暗)被忽略; *不*除最后一个。子尺寸用于计算阵列后面存储器背景的线性偏移量。 – WhozCraig