2013-01-09 75 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