Ошибка возврата массива двойников

0
double add_physics_vector(vector<double> v1, vector<double> v2)
{
    double horizontal_1 = v1[1] * cos(v1[0]);
    double vertical_1 = v1[1] * sin(v1[0]);
    double horizontal_2 = v2[1] * cos(v2[0]);
    double vertical_2 = v2[1] * sin(v2[0]);

    double horizontal_total = horizontal_1 + horizontal_2;
    double vertical_total = vertical_1 + vertical_2;
    double final_magnitude = sqrt(pow(horizontal_total, 2) + pow(vertical_total, 2));
    double final_direction = atan2(vertical_total, horizontal_total);
    double final_set[2] = {final_direction, final_magnitude};
    return final_set;
} 

Когда я пытаюсь вернуть final_set в мою функцию main(), компилятор (g++ - 4.7) дает мне эту ошибку:

error: cannot convert ‘double* to ‘double in return
warning: control reaches end of non-void function [-Wreturn-type]
  • 2
    Вы не можете вернуть массив. Используйте вектор или std::array .
  • 0
    @BrianBi понятия не имел! Разве вектор не является своего рода массивом? Знаете ли вы, что конкретно в структуре двух делает их разными для операторов return?
Показать ещё 1 комментарий
Теги:
arrays
return
return-type

2 ответа

3
Лучший ответ

Вы возвращаете массив (который затухает в указатель), но вы сказали, что вернете double. Вместо этого используйте вектор:

vector<double> final_set = {final_direction, final_magnitude};
return final_set;

Затем ваша функция будет объявлена как:

vector<double> add_physics_vector(vector<double> v1, vector<double> v2);

Если вы хотите избежать распределения динамической памяти, просто верните pair<double, double>:

pair<double, double> add_physics_vector(vector<double> v1, vector<double> v2)
{
    // ...as before
    return make_pair(final_direction, final_magitude);
}
0

Вы объявили, что тип возврата этой функции будет двойной, а не double * поэтому, конечно, вы получаете сообщение об ошибке.

Я предлагаю использовать malloc для создания нового массива удвоений, а затем вернуть его:

double * make_array()
{
    double * array = malloc(sizeof(double) * 2);
    if (array == NULL) { /* .. error handling */ }
    return array;
}

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

struct Vector
{
    double direction;
    double magnitude;
}

Vector make_vector()
{
    vector = (Vector){ 1, 2 };
    return vector;
}

Кроме того, вы можете использовать std::array из стандартной библиотеки C++.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню