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

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

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: Использование этого указателя в третьей функции для вычисления суммы Energy[]:

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

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


person Raugnar    schedule 19.03.2009    source источник
comment
Какая строка будет строкой 81 из вашей программы?   -  person Jonathan Adelson    schedule 19.03.2009
comment
Какая связь между шагами 1, 2 и 3. Я ничего не вижу?   -  person Milan Babuškov    schedule 19.03.2009
comment
Это будет линия TotalEnergy. Однако мне удалось исправить проблему, которая оказалась отсутствующей * в функции VecToArray в заголовке класса. Хотя указатель на локальную переменную — очень хороший момент, который оставляет мне гораздо более серьезную проблему. Однако откроет для него новый вопрос.   -  person Raugnar    schedule 19.03.2009


Ответы (5)


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

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

person Pete Kirkham    schedule 19.03.2009

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

person Maurice Perry    schedule 19.03.2009
comment
Кроме того, должен ли CFE возвращать int или double? - person Jonathan Adelson; 19.03.2009

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

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

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

int ary[Vec.size()];

To:

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

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

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

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

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

person Milan Babuškov    schedule 19.03.2009
comment
Зависит от компилятора. Это действительный C++0x, и, я думаю, GCC уже поддерживает его. - person Ferruccio; 19.03.2009
comment
Это недопустимо C++0x. Это действительно C99. - person Nemanja Trifunovic; 19.03.2009
comment
Неманья прав. Есть что-то похожее в том, что если у вас есть функция constexpr, вы можете использовать ее для создания массива, но vector::size не будет функцией constexpr. - person Richard Corden; 19.03.2009

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

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

person Benoît    schedule 19.03.2009