Wenn ich einen Parameter innerhalb einer Funktion ändere, ändert sich das auch für den Aufrufer?

Lesezeit: 2 Minuten

Ich habe eine Funktion unten geschrieben:

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

Wenn ich sie in der gleichen Datei durchrufe

trans(center_x,center_y,angle,xc,yc);

wird der Wert von xc und yc Veränderung? Wenn nicht, was soll ich tun?

  • Verwandte Fragen: stackoverflow.com/questions/410593/pass-by-reference-value-in-c, stackoverflow.com/questions/1322517/…

    – aussen

    9. November 2009 um 1:34 Uhr

Wenn ich einen Parameter innerhalb einer Funktion andere andert sich
Mark Ruschakoff

Da Sie C++ verwenden, wenn Sie möchten xc und yc Zum Ändern können Sie Referenzen verwenden:

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);
    // ...
}

Wenn Sie dagegen C verwenden, müssten Sie explizite Zeiger oder Adressen übergeben, wie zum Beispiel:

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);
    /* ... */
}

Ich würde empfehlen, sich die anzuschauen C++ FAQ Lite-Eintrag zu Referenzen für weitere Informationen zur richtigen Verwendung von Referenzen.

  • wenn ich c++ verwende, sollte ich hauptsächlich mit trans(x, y, theta, &xc, &yc) oder trans(x, y, theta, xc, yc) aufrufen;

    – Lisa

    9. November 2009 um 1:39 Uhr

1646935808 277 Wenn ich einen Parameter innerhalb einer Funktion andere andert sich
Chris Jester-Young

Das Übergeben als Referenz ist in der Tat eine richtige Antwort, C++ erlaubt jedoch die Verwendung von Rückgaben mit mehreren Werten std::tuple und (für zwei Werte) 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);
}

Auf diese Weise müssen Sie überhaupt keine Out-Parameter verwenden.

Auf der Anruferseite können Sie verwenden std::tie um das Tupel in andere Variablen zu entpacken:

using std::tie;

double xc, yc;
tie(xc, yc) = trans(1, 1, M_PI);
// Use xc and yc from here on

Hoffe das hilft!

Sie müssen Ihre Variablen als Referenz übergeben, was bedeutet

void trans(double x,double y,double theta,double &m,double &n) { ... }

Wie oben gesagt, müssen Sie als Referenz übergeben, um geänderte Werte von ‘m’ und ‘n’ zurückzugeben, aber … ziehen Sie in Betracht, alles als Referenz zu übergeben und const für die Parameter zu verwenden, die nicht in Ihrer Funktion geändert werden sollen, dh

void trans(const double& x, const double& y,const double& theta, double& m,double& n)

988640cookie-checkWenn ich einen Parameter innerhalb einer Funktion ändere, ändert sich das auch für den Aufrufer?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy