2

使用 C++,我想创建一个向量对象的实例input,如main()下面的测试程序的函数所示。向量填充数据,然后input通过引用传递给compute()函数。计算函数是返回两个向量对象realimag

是否可以按照下面代码片段中显示的方式返回这两个向量对象?

使用编译此代码gcc会出现以下错误:

In function ‘void compute(const std::vector<double>&, std::vector<double>&, std::vector<double>&)’:
error: declaration of ‘std::vector<double> real’ shadows a parameter
error: declaration of ‘std::vector<double> imag’ shadows a parameter

也许有更好的方法来做到这一点?这是完整的测试程序:

#include <iostream>
#include <vector>

void compute(const std::vector<double> &input,
                    std::vector<double> &real, std::vector<double> &imag)
{
        unsigned int N = input.size();
        unsigned int csize = (N / 2) + 1;

        // the error occurs here
        std::vector<double> real(csize);
        std::vector<double> imag(csize);

        for (int i = 0; i < csize; i++)
        {
            real[i] = input[i] * i;
            imag[i] = input[i] * -i;
        }
 } // end


int main()
{
    const int num = 10;
    std::vector<double> input(num);
    for(int i = 0; i < num; i++)
        input[i] = i;

    std::vector<double> real;
    std::vector<double> imag;

    compute(input, real, imag);

 } // end
4

2 回答 2

5

矢量已经存在,因此您不想再次创建它们,而是将它们调整为适当的大小:

real.resize(csize);
imag.resize(csize);

您的代码实际上是有效的,但是由于您在 -Werror 上进行编译,因此它被拒绝了。“阴影”意味着您将创建和修改函数本地的向量,因此通过引用传递的向量不会被更新。

于 2012-11-24T22:52:24.490 回答
1

将“计算”更改为:

void compute(const std::vector<double> &input,
                std::vector<double> &real, std::vector<double> &imag)
{
    unsigned int N = input.size();
    unsigned int csize = (N / 2) + 1;

    real.resize(csize);
    imag.resize(csize);

    for (int i = 0; i < csize; i++)
    {
        real[i] = input[i] * i;
        imag[i] = input[i] * -i;
    }
} // end
于 2012-11-24T22:54:05.737 回答