2013-08-27 158 views
0

在函數內部,我創建了一個2d數組,它可以從文本文件中填充,並且需要返回到main。該陣列在整個程序中保持恆定大小。從C++返回2d數組

我知道這是什麼,被問了很多,但我總是似乎得到兩個答案之一:

使用std ::向量或std ::陣列或其他一些性病的功能。我真的不明白這些是如何工作的,是否有任何網站實際解釋它們,以及它們與普通數組相比如何行動?我需要什麼特別的#包含?

使用指向數組的指針並返回指針。首先,對於這個問題的一些答案,由於本地數組顯然不起作用。我如何知道它何時有效並且無效?我如何在主函數中使用這個數組?

我對指針和std :: things的概念比實際的代碼有更多的麻煩,所以如果有一個網站,你知道它解釋得特別好,隨便放一下。

+0

即使你不知道的行數,你知道的列數? – jxh

+0

「正常」陣列實際上是行爲不端的人。傳遞和返回'std :: string'或'std :: vector '幾乎與傳遞一個簡單的'float'相同。 – MSalters

+0

我相信你已經看過關於指針的C++書(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),所以我會拋出一個鏈接來自R.Buckland的C講座(注意:C和C++是不同的語言,有時它們之間的差別非常微小,但指針的概念工作原理也是一樣的):http://www.youtube.com/watch?v=Rxvv9krECNw 。標準包含器的迭代器像指針一樣工作,容器的行爲與數組類似,但容器負責內存管理和邊界檢查。 – mars

回答

0

聽起來像你是C++新手。如果確實如此,我現在建議使用數組,因爲你可能不會使用任何STL容器給你的東西。現在,我們來談談指針。

你是正確的,如果你在你的函數中聲明瞭一個本地數組,主函數將無法訪問它。但是,如果您使用new關鍵字動態分配陣列,情況並非如此。當您使用new來分配數組時,您基本上會告訴編譯器爲您的程序保留一塊內存。然後你可以使用指針來訪問它,它實際上就是你保留的那塊內存的地址。因此,您不需要將整個數組傳遞給主函數,只需將指針(地址)傳遞給該數組即可。

以下是一些相關的解釋。我將添加到他們,因爲我覺得更多:

+0

如果我說得對:返回一些新的分配 - 沒有好處。使用一些共享/獨特的指針,而不是, –

0

創建一個二維數組的最簡單方法如下:

char (*array)[10]; 
array = new array[5][10]; 

二維陣列可能會非常棘手申報。變量聲明中的上述括號非常重要,它告訴編譯器array是一個指向10個字符數組的指針。

理解指針CC++非常重要,除非使用std::集合。即使那樣,指針也是普遍存在的,不正確的使用對程序來說可能是毀滅性的。

3

不一定是最好的解決方案,但最簡單的方法使它與矢量協同工作。優點是不需要刪除內存(自動發生),並且在大多數編譯器上以調試模式對數組進行邊界檢查。

#include <vector> 
#include <iostream> 

using array2D = std::vector< std::vector<int> >; 

array2D MyFunc(int x_size, int y_size) 
{ 
    array2D array(y_size, vector<int>(x_size)); 

    int i = 0; 
    for (int y = 0; y < array.size(); y++) 
    { 
     for (int x = 0; x < array[y].size(); x++) 
     { 
      // note the order of the index 
      array[y][x] = i++; 
     } 
    } 

    return array; 
} 

int main() 
{ 
    array2D bob = MyFunc(10, 5); 
    for (int y = 0; y < bob.size(); y++) 
    { 
     for (int x = 0; x < bob[y].size(); x++) 
     { 
      cout << bob[y][x] << "\n"; 
     } 
    } 
} 

活生生的例子: http://ideone.com/K4ilfX

+0

嗨,我試過這個,它有一個小問題。這一切工作正常,但我需要「使用命名空間標準;」因爲它幾乎沒有它爆炸 - 我不能使用字符串,cout或cin。我如何擁有兩條使用語句,或者能夠使用這些方法? (我有#include 和#include ,是的) – JTTCOTE

+0

@JTTCOTE在cout,string等的前面添加std ::,或者在標頭包含後使用namespace std。 –

+0

有什麼我失蹤?這並不是建立在VS express上的,所有與它有關的錯誤都不是數組。 – JTTCOTE