2013-07-18 97 views
-1

我有这个多维动态数组,我可以打印出六行零六列,但是我不能像它一样返回它。该函数应该初始化一个可以传递给其他函数的数组。我在这里做错了什么?我评论了“cout”部分,因为那不是我需要做的。谢谢!在结束返回一个多维动态数组?

return m;

,如果你一定要这样来做:

long initializeArray (void) 
{ 
    int i = 0, j = 0; 
    typedef int* rollarray; 
    rollarray *m = new rollarray[6]; 
    for (int i = 0; i < 6; i++) m[i] = new int[6]; 
    while (j < 6) 
    { 
     while (i < 6) 
     { 
      m[i][j] = 0; 
      //cout << m[i][j] << " "; 
      i++; 
     } 
     //cout << endl; 
     i = 0; 
     j++; 
    } 
} 
+0

这是C++不使用指针,使用STL容器 – aaronman

+0

你可以只传递一个指针;在你当前的情况下,你使用局部变量'* m'并返回它是无意义的。 – ludesign

+3

你的'return'语句或你的out参数在哪里?没有一个或另一个就很难返回任何东西。 – jxh

回答

4

你应该声明你的函数:

int** initializeArray(void)

,然后。不要忘记,你必须手动告诉其他使用这个指针的东西,它是一个6×6的数组,当你完成这些数组时,不要忘记delete[]

+0

+1,因为这是实际回答问题的唯一答案。不过,我同意使用动态数组的动态数组可能并不是正确的方法,除非您真的需要处理不同大小的行。 – Boris

+0

这也是唯一的答案,因为原始指针的使用,它不回答与原始指针,内存泄漏,未定义行为,分段错误等问题有关的以下5个问题。如果OP的兴趣具有学术性质,从错误中吸取教训当然是可取的。毫无疑问,如果他继续前进,他会学到一些关于指针的知识,但也可能是直接沿着正确的路径导致对“C++的做事方式”更好的感觉。正如Stroustrup所说:“不要黑客,专注于算法!” (或类似的我不记得确切。) – Pixelchemist

+0

我同意的程度,我不认为有必要花大量的时间在做C++方式之前了解'糟糕的过去的日子'。然而,不管喜欢与否,指针都是C++的一部分,任何全面的C++程序员都必须学习如何最终正确地使用它们。例如,'std :: vector'对于那些想要访问硬件的人或者编写他们自己的高效容器不会有多大帮助。 –

2

我不会重复我的完整答案,为什么动态二维矩阵(这显然是一个)不是在C++中的方式。

Answer on: 1D or 2D array, what's faster?(开始阅读@长的答案,或为什么动态二维数据存储(指针到指针或载体矢量的-)可以简单/小矩阵“坏”。

你会发现:

  • 作一个比较详细的解释,为什么你不希望使用指针到指针的动态数组
  • 简单矩阵的一个示例类对象

您甚至不需要将数据初始化为零的函数。 只要写

matrices::simple<int> matrix_object(6, 6); 

获得尺寸的6x6的初始化为零的矩阵。

现在,你可以通过

matrix_object(0,1) = 2; // sets 2nd element of first row to 2 

矩阵写入流的“C++办法”访问内容将包括定义operator<<该类像:

template<typename T> 
std::ostream & operator<< (std::ostream &stream, matrices::simple<T> const & matrix) 
{ 
    typedef typename matrices::simple<T>::size_type size_type; 
    for (size_type i(0u); i<matrix.rows(); ++i) 
    { 
    for (size_type j(0u); j<matrix.cols(); ++j) 
     stream << std::setw(4) << std::right << matrix(i,j); 
    stream << std::endl; 
    } 
    return stream; 
} 

您可以轻松地输出您的矩阵通过这种方式写作:

std::cout << matrix_object << std::endl; 

加上以前的snip PTES这将输出:

 0 2 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0

如果你想继续走你就必须解决在代码中几个问题的指针。 我已经添加了两个参数来启用其他尺寸,但如果需要可以再次替换为6。

int** new_initialized_array (size_t const rows, size_t const cols) 
{ 
    typedef int* rollarray; 
    rollarray *m = new rollarray[rows]; 
    size_t allocated_arrays(0u); 
    try 
    { 
     for (size_t i(0u); i < rows; ++i) 
     { 
     m[i] = new int[cols]; 
     ++allocated_arrays; 
     for (size_t j(0u); j<cols; ++j) m[i][j] = 0; 
     } 
    } 
    catch (std::bad_alloc & e) 
    { 
     for (size_t i(0u); i < allocated_arrays; ++i) delete[] m[i]; 
     delete[] m; 
     throw; 
    } 
    return m; 
} 

的问题我解决:

  1. 要返回一个指针,该函数必须有一个返回类型,实际上是一个指针(长是一个无符号值)。
  2. 你需要跟踪你的分配。如果其中一个失败,则需要将其余部分回滚以避免内存泄漏。
  3. 你不需要double-while循环。你的外部循环已经存在了(你配置的那个),所以你只需要一个内部循环来为你的数组设置初始值。
  4. 最后但并非最不重要我重命名的功能。它实际上不是“初始化”现有的数组,而是创建一个新的初始化数组。

我只能推荐阅读上面的链接(或任何其他关于如何根据RAII处理2D数据的资源)。

2

C++ :)

#include <vector> 
#include <iostream> 

std::vector<std::vector<int> > initializeVector() { 
    std::vector<std::vector<int> > vec(6, std::vector<int>(6)); 

    int i = 0, j = 0; 
    while (i < 6) { 
     while (j < 6) { 
      vec[i][j] = i+j; 
      j++; 
     } 

     j = 0; 
     i++; 
    } 

    return vec; 
} 

int main(int argc, char* argv[]) { 
    std::vector<std::vector<int> > g_vec = initializeVector(); 

    int i = 0, j = 0; 
    while (i < 6) { 
     while (j < 6) { 
      std::cout << g_vec[i][j] << std::endl; 
      j++; 
     } 

     std::cout << "-----------------" << std::endl; 
     j = 0; 
     i++; 
    } 

    return 0; 
} 
1

它是一个家庭作业?还是你想在C++中做矩阵代数?

如果它不是家庭作业,那么首先检查是否存在对您来说更容易使用并且性能更高的事物。 Pixelchemist提出了很好的观点,所以你应该能够使用别人的代码为你做你的工作。

看看到本征库:http://eigen.tuxfamily.org/dox/TutorialAdvancedInitialization.html

// Initializing a 6x6 dynamic size matrix with zeros, adapted from documentation 
using namespace Eigen; 
ArrayXXf a3 = ArrayXXf::Zero(6, 6); 
std::cout << a3 << "\n"; 
+0

Eigen +1,这个库很简单 – Boris