【问题标题】:Send dynamic array to function C++将动态数组发送到函数 C++
【发布时间】:2012-02-28 13:30:10
【问题描述】:

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

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. 

至于静态声明的循环,一切都非常简单。将此数组作为参数发送给函数。

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

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

【问题讨论】:

    标签: c memory dynamic


    【解决方案1】:

    一个函数如:

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

    假设它是一个正在操作的二维数组,应该足以满足需求。另外,考虑使用std::vector&lt;std::vector&lt;int&gt;&gt; 而不是手动分配的多维数组。这种方法将有助于防止泄漏。第二种方法还可以让您拥有锯齿状数组。

    【讨论】:

    • 这取决于数组是如何定义的。我通常更喜欢将它包装在一个类中,因为否则没有简单的解决方案。
    • @JamesKanze :就我个人而言,如果在多个地方需要它或在程序中经常使用它,我会将它包装在一个类或结构中。否则对于一个地方使用 vector&lt;vector&lt;int&gt;&gt; 会很好,你不觉得吗?
    • 嗯,非常感谢,但我已经提到将它包装在课堂上会很不方便。更何况数组只用了一次,所以希望能逃课。您展示的第一种方式似乎很简单,但需要一些解释。首先,我现在将发布我的静态 C 代码以更好地描述问题。然后我将发布我的数组的声明。希望,这也会有所帮助。但不幸的是,我需要你的帮助。函数中发送数组和接收数组的动作还是不够亮。
    • @BhargavBhat 写起来有点尴尬。 std::vector&lt;std::vector&lt;double&gt; &gt; a2d( rows, std::vector&lt;double&gt;( columns ) );
    • @OP : 请将函数签名更改为int left(int **picture,int row,int col)。您的其余代码看起来不错。它应该像现在一样继续工作。此外,如果那是您真正想要的,您应该使用bool 类型。我以int 为例。
    【解决方案2】:

    通常的解决方案是将数组包装在一个类中; C 不处理 数组非常好,而 C++ 对 2D 数组没有任何真正的支持 它的图书馆也是。所以你定义:

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

    使用使用i * myColumnCount + j 转换两个索引的访问器,或者:

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

    使用初始化逻辑确保所有行具有相同的 长度。第一个通常更简单,更容易理解;如果你 想增加列数,但是,第二个是 容易得多。

    【讨论】:

    • 不幸的是,我有五个数组要管理,所以这些方法可能有点“大”。所以我希望找到一个更简单更小的解决方案。不过,感谢您的支持,我会牢记这种方法。
    • 我不确定您所说的“更大”是什么意思。使用 std::vector 而不是 double* 会增加一点点,但通常只相当于 2 或 3 个指针。不管数组的大小。
    • 对不起,我是 C++ 新手。所以 std::vector 对我来说毫无意义。当然,我可以阅读它,但如果有任何其他方式(类包装除外),那就太好了
    • @user1131662 如果您是 C++ 新手,您知道创建数组的其他方法。 std::vector 是最简单和最安全的,所以它会在任何体面的 C++ 教学文本中首先被教授。早在newT[] 之前。
    • 看来我们使用不同的教学方式。我还没有被告知,编译器的核心发生了什么,但我已经使用了newmalloc。但我以前从未听说过std::vector
    【解决方案3】:

    您有多种选择:

    1. 数组数组。例如,对于int 将是int **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 矩阵“卷曲” - 使用不同长度的线,但您需要一个数组来保存每个长度。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢。关于第一种方式,我听说的很少。对我来说这似乎很复杂,对不起。第二个比较简单。我什至尝试使用它。但是功能方面仍然存在同样的问题。我从来没有注意过最后一个。所以如果我没有找到一个完美的解决方案,我会再读一读这个
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2012-10-19
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多