2011-11-15 84 views
-5

Possible Duplicate:
How do I use arrays in C++?通二維數組的方法C++

我不知道如何做到這一點在C++:

main() 
{ 
    float array[5][4]; 

    transpose(array); 
} 

void transpose(float** array); 

=>我得到了一些一些編譯錯誤:vector<KeypointMatch, std::allocator<KeypointMatch> >

如何我可以將二維數組的變量傳遞給C++中的方法嗎?

在此先感謝。

+2

float ** array;正在工作...,爲什麼? – olidev

+5

您粘貼的「錯誤」引用的類型在您發佈的代碼中無處可用。 – Mat

+0

您的錯誤狀態是您正在玩一個向量<>類,這是無處可尋找您的代碼... –

回答

-1

如果您要讀取或修改矩陣的位置,那可以,但是您要修改矩陣本身。在你的例子中,你需要創建另一個矩陣。

編輯:我修改了這個使用unique_ptr,因爲評論(雖然我不認爲OP是真的準備好/對此感興趣)。

EDITED我知道你可以轉置矩陣「就地」。然而,這不是OP的問題。感謝所有關於此的評論者。

std::unique_ptr<>是一個讓你管理指針的類,保證指針在使用後會自動刪除。選項將是auto_ptr。不幸的是,它不支持數組的向量。 unique_ptr支持它們,儘管它是新標準C++ - 0x的一部分。

所以,你需要修改轉置到正規參數:

void transpose(std::unique_ptr<float**> &array, int rows, int columns) 
{ 
    std::unique_ptr<float **> aux = array; 
    array.reset(new float[columns][rows]); 

    // now transpose aux into array 
} 

這也意味着,當你做你無法創建原始數組:

float array[5][4]; 

這是一個矩陣堆棧,你不能指望修改指針本身,它沒有任何意義。更好,如果你這樣做:

int main() 
{ 
    std::unique_ptr<float **>array(new float[5][4]); 
    transpose(array, 5, 4); 
    // ... use array ... 
} 

這就是說,另一種解決方案是稍微改變轉置過程的簽名,並使它成爲一個功能。

std::unique_ptr<float **> transpose(float** array, int rows, int columns) 
{ 
    std::unique_ptr<float **> toret(new float[columns][rows]); 

    // now transpose array into toret 

    // end 
    return toret; 
} 

..和你不需要改變任何東西在你的程序。

int main() 
{ 
    float array[5][4]; 
    std::unique_ptr<float **> transposed(transpose(array, 5, 4)); 

    // ... more things ... 
} 
+2

這使用裸指針來管理資源,因此是不安全的。如果標記爲'現在將aux替換爲數組'的部分出於任何原因拋出,則會發生泄漏。 '-1'。 – sbi

+0

我和-1sbi *和*一樣,因爲您實際上可以在原位轉置矩陣。 –