从函数返回数组

时间:2011-06-21 09:19:01

标签: c++ arrays

这是我的代码

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

因为我想返回一个数组,我该怎么做才能返回而不使用指针?

7 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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();

答案 2 :(得分:1)

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

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

答案 3 :(得分: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)

答案 4 :(得分: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;

答案 5 :(得分:1)

一般情况下,你不应该在C ++中使用数组,而是更喜欢使用STL容器类(std::vector是这些中最像数组的)。当然也有例外,在某些情况下你应该使用一个数组(从不说永远不会),但在你的例子中,我建议改为使用vector

Sehe的回答提供了使用std::vector并使用数组大小​​初始化它的示例:

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

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

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

答案 6 :(得分:0)

您无法从C ++中的函数返回c样式数组。但是,您可以从函数

返回std::array容器

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

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