2012-02-28 63 views
0

我有一个现在是静态的数组。这是我用它做的操作。 首先我创建一个二维数组。然后我用循环填充它。然后,我发送它的功能,也有使用周期。 在这里,我想发布一些示例代码,这与我的类似。发送动态数组到函数C++

bool picture[20][20]; //here's my array right now. Pretty ugly. Just for testing. 
for (int y=0;y<Height;y++) 
{ 
    for (int x=0;x<Width;x++) 
    { 
     if (treshold<middle) 
     { 
      picture[x][y]=1; 
     } 
     else 
     { 
      picture[x][y]=0; 
     } 
    } 
} 
//Here's an example of filling an array 

leftk = left(picture,widthk, heightk); //That's how I use a function 

int left(int picture[200][200],int row,int col) 
{ 
    for (int x = 0; x <=row-1; x++) 
    { 
     for (int y = 0; y <=col-1 ;y++) 
     { 
      if (picture1[x][y]==1) 
      { 
       return x; 
      } 
     } 
    } 
} 
//And that's the function itself 

所以在这里,我需要将我的数组切换到动态。这就是我声明我的动态阵列

bool** picture=new bool*[size]; 
    for(int i = 0; i < size; ++i) 
     picture[i] = new bool[size]; 

//size is just a variable. 

至于静态声明的周期,一切都非常简单。发送这个数组作为参数来运行。

我已经设法创建了一个动态数组,这很简单。然后我用数字填写它。这里也没有问题。但我不明白,如何发送一个数组来运行,而且如何在那里使用它。 你能否给我一个修改函数中二维数组的例子。 对不起,这样一个新手问题。希望有人会帮助。

顺便说一下,我认为在这里类包装会有点混乱。

回答

4

的函数,例如:

Process2DArray(int **pArray, int rowCount, int colCount) 

应该足够的需要假设其正被操作的2D阵列。另外,请考虑使用std::vector<std::vector<int>>而不是手动分配的多维数组。这种方法将有助于防止泄漏。第二种方法也可以让你有锯齿阵列。

+0

这取决于如何定义数组。我通常宁愿将它包装在课堂上,因为没有其他简单的解决方案。 – 2012-02-28 13:55:38

+0

@JamesKanze:就个人而言,如果它需要在多个地方或在程序中经常使用,我会将它包装在类或结构中。否则,对于一个地方使用'矢量>'会很好,你不觉得吗? – 2012-02-28 14:08:07

+0

恩,非常感谢,但我已经提到在课堂上包装它会很不方便。更重要的是,这个数组只用了一次,所以我希望我能逃脱课程。你展示的第一种方式似乎很简单,但需要一些解释。首先,我现在会发布我的静态C代码以更好地描述问题。然后我会发布我的数组的声明。希望,这也会有所帮助。但不幸的是,那么我需要你的帮助。发送数组并在函数中接收数据的操作仍然不够明亮。 – user1131662 2012-02-28 15:10:34

1

您有几种选择:

  1. 数组的数组。例如,对于intint **a它应该能够保持n阵列new int *[n],然后用for通过他们去并初始化它们a[i] = new int[elems_per_line]
  2. 一个“压缩的”一维数组int *a = new int[n * elems_per_line],其中元件(I,J) - 0-实际上是a[i * elems_per_line + j]
  3. 您可以细化点1,并让2D矩阵“卷曲” - 用不同长度的线条,但您需要一个数组来保存每个长度。

希望这会有所帮助。

+0

非常感谢。我对第一种方式了解甚少。对我来说似乎相当复杂,对不起。第二个很简单。我甚至尝试过使用它。但功能还是一样的问题。我从来没有为最后一个而哭泣。所以,如果我找不到完美的解决方案,我会阅读关于这一个更多 – user1131662 2012-02-28 15:15:21

2

通常的解决方案是将数组包装在一个类中; C不能很好地处理 数组,并且C++也没有对其库中的二维数组提供任何实际支持。所以,你要么定义:

class Array2D 
{ 
    std::vector<double> myData; 
    int myColumnCount; 
    int myRowCound; 
    // ... 
}; 

与转换使用i * myColumnCount + j,或这两个指标来完成:

class Array2D 
{ 
    std::vector<std::vector<double> > myData; 
    // ... 
}; 

与初始化逻辑保证所有行具有相同的 长度。第一个通常更简单,更容易理解;如果 想要增加列数,但是,第二个是 明显更容易。

+0

不幸的是,我有五个数组来管理,所以这些方法可能会相当“大”。所以我希望找到一个更简单,更小的解决方案。但是,尽管如此,感谢您的支持,我会牢记这一方法。 – user1131662 2012-02-28 15:07:50

+0

我不确定你的意思是“更大”。使用'std :: vector'而不是'double *'将会增加一点点,但通常只有大约相当于2或3个指针。无论数组的大小如何。 – 2012-02-28 15:44:25

+0

对不起,但我是新来的C++。所以std :: vector对我来说毫无意义。当然,我可以阅读它,但如果还有其他方法(除了类封装),它会很棒 – user1131662 2012-02-28 15:48:52