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?

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.

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)
9886400cookie-checkWenn ich einen Parameter innerhalb einer Funktion ändere, ändert sich das auch für den Aufrufer?yes
Verwandte Fragen: stackoverflow.com/questions/410593/pass-by-reference-value-in-c, stackoverflow.com/questions/1322517/…
– aussen
9. November 2009 um 1:34 Uhr