从指向数组的函数返回指针时出错

时间:2009-03-19 14:15:03

标签: c++ arrays pointers function return

我有点小提琴,因为我不知道为什么我的代码在编译时会出现以下错误:

1>..\SA.cpp(81) : error C2664: 'CFE' : cannot convert parameter 1 from 'int' to 'int []'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

基本上我想:

步骤1:使用:

从矢量转换为数组
int* VecToArray(vector<int> Vec)
{
    int ary[Vec.size()];

    for(int i = 0; i < Vec.size(); i++)
        ary[i] = Vec[i];

    return ary;
}

步骤2:调用一个数组作为参数的函数,它返回一个新生成的数组的指针:

int* CFE(int density[])
{
   ...do stuff to generate 'double Energy[]'....

    return Energy;
}

步骤3:在第三个函数中使用该指针计算能量[]的总和:

double ObjFunction (double *E_Array) 
{
    double SumEnergy = 0;

    int n = 10; // Is irrelivant

    for (int i = 0; i < n; i++)
    {
        SumEnergy += E_Array[i];
    }

    return SumEnergy;
}

为了简化编码,我使用了类似的函数,其中VectorName是一个整数向量:

double TotalEnergy = ObjFunction ( CFE ( VecToArray ( VectorName ) ) );

我显然在某处错误地获取参数类型,但我不知道为什么我自己。拥有更有经验的眼睛的人是否可以协助发现它/它们?

5 个答案:

答案 0 :(得分:4)

Energy来自哪里?如果它是double[],那么您不能将其转换为int*

std::vector<int>保证是连续的,因此如果您想将std::vector<int> VectorName转换为const int*,请使用&VectorName[0]。另一方面,如果您的CFE函数修改了数组传递,那么最好在本地创建它。

答案 1 :(得分:3)

不确定编译器错误,但如果从函数返回本地数组,则会遇到大问题。

答案 2 :(得分:2)

第1步有几个问题:

  • 您正在尝试创建一个可变大小的数组。你不能用C89或C ++做这件事(我想C99补充一下)。
  • 您正在返回一个指向超出范围的局部变量的指针。

答案 3 :(得分:2)

你应该解决这个问题:

int ary[Vec.size()];

要:

int *ary = new int(Vec.size());

编译器在编译时不知道Vec.size(),因此无法创建数组。

请确保稍后释放内存。

那就是解决这个问题。但是,我认为你的方法也不好。 Vector具有与常规数组几乎相同的性能,但更安全,更易于使用。你为什么不用矢量?

即使你决定使用数组,按值传递也不是很有效。特别是因为您立即将输出重定向到另一个功能。我宁愿使用引用来解决这类问题。

答案 4 :(得分:1)

您无法创建具有动态评估大小的数组。 您无法返回本地定义的数组。

但是,您可以将&amp; myVector [0]视为数组。