Когда я изменяю параметр внутри функции, он тоже изменяется для вызывающего?
Я написал следующую функцию:
void trans(double x,double y,double theta,double m,double n)
{
m=cos(theta)*x+sin(theta)*y;
n=-sin(theta)*x+cos(theta)*y;
}
Если я назову их в том же файле
trans(center_x,center_y,angle,xc,yc);
изменится значение xc
и yc
? Если нет, что мне делать?
Ответы
Ответ 1
Поскольку вы используете С++, если вы хотите изменить xc
и yc
, вы можете использовать ссылки:
void trans(double x, double y, double theta, double& m, double& n)
{
m=cos(theta)*x+sin(theta)*y;
n=-sin(theta)*x+cos(theta)*y;
}
int main()
{
// ...
// no special decoration required for xc and yc when using references
trans(center_x, center_y, angle, xc, yc);
// ...
}
Если вы используете C, вам придется передавать явные указатели или адреса, например:
void trans(double x, double y, double theta, double* m, double* n)
{
*m=cos(theta)*x+sin(theta)*y;
*n=-sin(theta)*x+cos(theta)*y;
}
int main()
{
/* ... */
/* have to use an ampersand to explicitly pass address */
trans(center_x, center_y, angle, &xc, &yc);
/* ... */
}
Я бы рекомендовал проверить С++ FAQ Lite запись в ссылках для получения дополнительной информации о том, как правильно использовать ссылки.
Ответ 2
Передача по ссылке действительно является правильным ответом, однако С++ sort-to позволяет возвращать многозначные значения с использованием std::tuple
и (для двух значений) std::pair
:
#include <cmath>
#include <tuple>
using std::cos; using std::sin;
using std::make_tuple; using std::tuple;
tuple<double, double> trans(double x, double y, double theta)
{
double m = cos(theta)*x + sin(theta)*y;
double n = -sin(theta)*x + cos(theta)*y;
return make_tuple(m, n);
}
Таким образом, вам не нужно использовать внешние параметры.
На стороне вызывающего абонента вы можете использовать std::tie
для распаковки кортежа в другие переменные:
using std::tie;
double xc, yc;
tie(xc, yc) = trans(1, 1, M_PI);
// Use xc and yc from here on
Надеюсь, это поможет!
Ответ 3
Вам нужно передать свои переменные по ссылке, что означает
void trans(double x,double y,double theta,double &m,double &n) { ... }
Ответ 4
как сказано выше, вам нужно передать ссылку на возвращаемые измененные значения "m" и "n", но... рассмотреть возможность передачи всего по ссылке и использовать const для параметров, которые вы не хотите изменять внутри ваша функция, т.е.
void trans(const double& x, const double& y,const double& theta, double& m,double& n)