【问题标题】:Returning an array from a function [duplicate]从函数返回数组[重复]
【发布时间】:2011-09-19 08:41:12
【问题描述】:

这是我的代码

double hour_payload_add(int entries , double array[])
{
    int index=0 ,k=0;
    int totalpayload=0;
    double returnarray[entries/120];
    while(k< entries)
    {
           totalpayload = totalpayload + array[k];
            if(k%120==0)
                {
                returnarray[index] = totalpayload;
                index++;
                totalpayload=0;
                }

    }

return returnarray;
}

这里我叫它

double hourgraph[hrentries];
 hourgraph= hour_payload_add(entries , graph);

因为我想返回一个数组,我应该怎么做才能在不使用指针的情况下返回?

【问题讨论】:

  • 这不是C++ 代码,因为double returnarray[entries/120]; 是在运行时决定的(在C99 中有效)
  • @iammilind:在这种情况下,“代码”是不可数名词;因此,“C++ 代码”是不正确的。只是说。

标签: c++ arrays


【解决方案1】:

您不能从 C++ 中的函数返回 c 样式的数组。但是是的,您可以从函数返回 std::array 容器

您可以返回在函数内部本地创建的 c 样式数组的起始地址,但是当函数返回时该数组会被清除,并且您会留下一个指向不想要的指针的指针。

您必须使用new 动态分配一个数组,然后返回指向它的指针。

【讨论】:

  • std::array&lt;int, 3&gt; foo() { std::array&lt;int, 3&gt; ar{0,1,2}; return ar; }
【解决方案2】:

数组通过引用传递给函数并且不返回任何内容。小例子:

void hour_payload_add(int entries , double array[], double (&returnArray)[SIZE])
{
  // returnArray will be updated as it's external to function.
}

void hour_payload_add(int entries , double array[], double *returnArray) // <-- pointer
{
  // returnArray will be updated as it's external to function.
}

用法:

double returnArray[SIZE];
hour_payload_add(entries, array, returnArray);

【讨论】:

  • 先生,我已经以这种方式定义并调用了该函数,但它给了我错误,即条目未在此范围内定义。数组未在此范围内定义,以及要写什么代替大小
  • @sajid,在 C++ 中,数组需要是固定大小的。假设,如果您发现难以评估,那么您也可以简单地通过指针传递。看,我已经编辑了我的答案。
【解决方案3】:

一般而言,您不应该在 C++ 中使用数组,而是更喜欢使用 STL 容器类(std::vector 是其中最类似于​​数组的)。当然也有例外,在某些情况下您应该使用数组(永远不要说永远),但在您的示例中,我建议改用 vector

Sehe 的回答提供了一个使用 std::vector 的示例,并使用数组的大小对其进行初始化:

std::vector<double> returnarray(entries/120);

这使用了一个设置数组默认大小的构造函数。更有用的是,向量可以动态更改大小,并且您可以按照建议从函数中返回它。根据编译器所做的优化,它甚至可能不会创建向量的副本 - 但这取决于编译器。

我的建议是查看vector 和其他容器的文档,而不是数组。

【讨论】:

    【解决方案4】:

    两行更改:

    std::vector<double> hour_payload_add(int entries , std::vector<double> array) // HERE
    {
        int index=0 ,k=0;
        int totalpayload=0;
        std::vector<double> returnarray(entries/120);                            // HERE
    
        /// ....
    
        return returnarray;
    }
    

    好的,也许在顶部添加一个

    #include <vector>
    

    为了获得全部奖励,我建议多修改一下:

    std::vector<double> hourgraph(hrentries);
    hourgraph = hour_payload_add(graph);
    
    // ...
    std::vector<double> hour_payload_add(std::vector<double> array)
    {
        const size_t entries = array.size();
    

    【讨论】:

      【解决方案5】:

      您不能在 C++ 中返回数组 - 您宁愿返回指向一块内存的指针。

      此外,您不能返回指向堆栈上本地声明数组的指针,因为堆栈会在函数终止后立即恢复。您必须使用newmalloc 动态分配它,并返回一个指向其开头的指针。

      【讨论】:

      • 当然可以。 std::array。尽管考虑到容器的动态大小,这里使用向量更合适。
      【解决方案6】:

      你必须使用 new 创建你的数组。所以你的函数应该是这样的:

      double* hour_payload_add(int entries , double array[])
      {
          int index=0 ,k=0;
          int totalpayload=0;
          double* returnarray = new double[entries/120];
          while(k< entries)
          {
                 totalpayload = totalpayload + array[k];
                  if(k%120==0)
                      {
                      returnarray[index] = totalpayload;
                      index++;
                      totalpayload=0;
                      }
      
          }
      
          return returnarray;
      }
      

      使用数组后,您必须通过在数组上调用 delete[] 来释放空间以避免内存泄漏:

      int entries = 5;
      double* array = hour_payload_add(entries);
      for (int i=0; i < entries; i++)
      {
          std::cout << array[i] << std::endl;
      }
      
      delete[] array;
      

      【讨论】:

      • +1 提到了delete[] 的重要性,即使我认为使用vector 会是一个更安全的解决方案:)
      • 确实如此。这很麻烦,因为调用范围必须拥有分配的内存块的所有权。此外,OP 特别要求提供无指针解决方案。
      【解决方案7】:

      为此,您应该使用指针并在填充之前创建数组(而不是在填充它的函数中)。

      double* hour_payload_add(int entries , double array[])

      但我更喜欢将数组作为参考传递。

      void hour_payload_add(int entries , double array[], double&amp; ret_array[])

      或者甚至更好(正如其他人所说)是使用向量。

      void hour_payload_add(std::vector&lt;double&gt;array, std::vector&lt;double&gt;&amp; ret_array)

      【讨论】:

      • 先生,我是否应该使用您的第三种方法完成它,我以这种方式调用它 hour_payload_add(entries ,graph ,&hourgraph);先生请指导我哪里错了
      • 看看@sehe的回答——他已经给你完整的功能了。
      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多