2009-11-09 6 views
13

Ich habe eine Funktion geschrieben:Wenn ich einen Parameter in einer Funktion ändere, ändert sich das auch für den Aufrufer?

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 anrufe von

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

ändert sich der Wert von xc und yc? Wenn nicht, was soll ich tun?

+0

Verwandte Fragen: http://stackoverflow.com/questions/410593/pass-by-reference-value-in-c, http://stackoverflow.com/questions/1322517/passing -a-modifizierbare-Parameter-zu-Funktion – outis

+0

Frage gestellt ... Hausaufgabenfrage! Bitte verwenden Sie den Stapelüberlauf für etwas anderes als einen Antwortschlüssel. – bobby

Antwort

30

Da Sie mit C++, wenn Sie xc und yc ändern möchten, können Sie Verweise 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); 
    // ... 
} 

Während, wenn Sie C verwendet haben, würden Sie explizite Zeiger oder Adressen passieren müssen, wie wie:

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

würde ich empfehlen, für etwas mehr Informationen, um die C++ FAQ Lite's entry on references Überprüfung heraus, wie Referenzen richtig zu verwenden.

+0

vielen Dank – Lisa

+0

Wenn ich C++ benutze, sollte ich im Wesentlichen mit trans (x, y, Theta, & xc, & yc) oder trans (x, y, Theta, xc, yc) aufrufen; – Lisa

+4

trans (x, y, Theta, xc, yc); – Artelius

1

Sie benötigen Variablen durch Verweis übergeben, die

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

Vorbei Referenzmittel ist in der Tat eine richtige Antwort, aber C++ Art-of ermöglicht Multi-Werte zurückgibt std::tuple und (für zwei Werte) unter Verwendung von 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 Out-Parameter überhaupt nicht verwenden.

Auf der Anruferseite können Sie std::tie verwenden, um die 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!

0

wie oben erwähnt, müssen Sie als Verweis zurückgegeben werden, um geänderte Werte von 'm' und 'n' zurückzugeben, aber ... überlegen Sie, ob Sie alles als Referenz übergeben und const für die Parameter verwenden, die nicht geändert werden sollen in Ihrer Funktion dh

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