Подтвердить что ты не робот

Когда я изменяю параметр внутри функции, он тоже изменяется для вызывающего?

Я написал следующую функцию:

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? Если нет, что мне делать?

4b9b3361

Ответ 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)