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]
Вы возвращаете массив (который затухает в указатель), но вы сказали, что вернете 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);
}
Вы объявили, что тип возврата этой функции будет двойной, а не 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++.
std::array
.