Ошибка при возврате указателя из функции, указывающей на массив

StackOverflow https://stackoverflow.com/questions/662378

Вопрос

Я немного запутался в том, что я не знаю, почему мой код выдает следующую ошибку при компиляции:

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

Чтобы упростить кодирование, я использовал функции, подобные so, где VectorName - это целочисленный вектор:

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

Очевидно, я где-то неправильно указываю типы параметров, хотя сам просто не могу понять, почему.Может ли кто-нибудь с более опытным зрением помочь определить это / их?

Это было полезно?

Решение

Где же Energy родом из?Если это double[] тогда вы не сможете просто привести его к int*.

std::vector<int> гарантированно будет непрерывным, поэтому, если вы хотите преобразовать std::vector<int> VectorName для const int* использовать &VectorName[0].Если, с другой стороны, ваша функция CFE изменяет переданный массив, вероятно, лучше создать его локально.

Другие советы

Не уверен насчет ошибки компилятора, но у вас возникнут большие проблемы, если вы вернете локальный массив из функции.

Шаг 1 имеет несколько проблем:

  • Вы пытаетесь создать массив переменного размера.Вы не можете сделать это в C89 или C++ (я думаю, что C99 добавляет это).
  • Вы возвращаете указатель на локальную переменную, которая вышла за пределы области видимости.

Ты должен это исправить:

int ary[Vec.size()];

Для:

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

Компилятор не знает Vec.size() во время компиляции, поэтому он не может создать массив.

Обязательно освободите память позже.

Это делается для того, чтобы устранить проблему.Но я думаю, что ваш подход тоже не очень хорош.Vector is обладает почти такой же производительностью, как обычный array, но намного безопаснее и проще в использовании.Почему бы вам просто не использовать векторы?

Даже если вы решите использовать массивы, передача их по значению не очень эффективна.Тем более, что вы немедленно перенаправляете выходные данные в другую функцию.Я бы предпочел использовать ссылки для решения такого рода задач.

Вы не можете создать массив с динамически вычисляемым размером.Вы не можете вернуть локально определенный массив.

Однако вы можете рассматривать &myVector[0] как массив.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top