从函数返回数组

6

这是我的代码

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);

如果我想返回一个数组,而不使用指针,应该怎么做?


3
这不是 C++ 代码,因为 double returnarray[entries/120]; 是在运行时决定的(在 C99 中有效)。 - iammilind
1
@iammilind:“Code” 在这个语境中是不可数名词,因此,“a C++ code” 是不正确的说法。就是这样。 - Lightness Races in Orbit
相关文章:http://stackoverflow.com/questions/4174901/how-do-i-return-an-array-from-a-function - Lightness Races in Orbit
7个回答

9

数组按引用传递给函数,不要返回任何东西。小例子:

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);

先生,我已经按照这种方式定义并调用了函数,但它给出了错误提示,说“entries”在此范围内未定义。数组在此范围内也未定义,我应该写什么来代替“size”? - sajid
@sajid,在C++中,数组需要是固定大小的。假设你发现难以评估,那么你也可以通过指针传递。看,我已经编辑了我的答案。 - iammilind

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();

1

你必须使用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;

2
+1 提到了 delete[] 的重要性,尽管我认为使用 vector 可能会更安全 :) - icabod
确实如此。这很凌乱,因为调用作用域必须接管已分配的内存块。此外,OP明确要求一个无指针的解决方案。 - Lightness Races in Orbit

1
一般来说,在C++中不应该使用数组,而是优先使用STL容器类(其中std::vector最像数组)。当然也有例外情况,在某些情况下应该使用数组(永远不要说永远),但在您的示例中,我建议使用vector代替。
Sehe的答案提供了使用std::vector并用数组大小进行初始化的示例:
std::vector<double> returnarray(entries/120);

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

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


1

在C++中,你不能返回数组 - 你应该返回指向内存块的指针。

此外,你不能返回指向栈上局部声明的数组的指针,因为函数终止后栈会被恢复。你必须使用newmalloc动态分配它,并返回指向其开头的指针。


当然可以。std::array。虽然在这里使用动态大小的容器更合适,但是也可以使用数组。 - Lightness Races in Orbit

1

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

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

然而,我更喜欢将数组作为引用传递。

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

甚至更好的方法(正如其他人所说)是使用向量。

void hour_payload_add(std::vector<double>array, std::vector<double>& ret_array)


先生,我是否应该使用您的第三种方法来完成它?我是这样调用它的 hour_payload_add(entries, graph, &hourgraph)。先生,请指导我错在哪里。 - sajid
看一下@sehe的答案-他给出了完整的函数。 - graham.reeds

0

在C++中,您不能从函数返回C风格数组。但是,您可以从函数返回std::array容器。

您可以返回在函数内部创建的C风格数组的起始地址,但是当函数返回时,该数组会被清除,您将得到一个指向不想要的内容的指针。

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


std::array<int, 3> foo() { std::array<int, 3> ar{0,1,2}; return ar; } - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接