2013-08-27 116 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