2009-11-09 17 views
13

He escrito una función a continuación:Cuando cambio un parámetro dentro de una función, ¿cambia para la persona que llama también?

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

Si los llamo en el mismo archivo por

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

será el valor de xc y yc cambio? Si no, ¿qué debería hacer?

+0

preguntas relacionadas: http://stackoverflow.com/questions/410593/pass-by-reference-value-in-c, http://stackoverflow.com/questions/1322517/passing -a-modificable-parámetro-a-función-c – outis

+0

pregunte solicitado ... ¡Pregunta de tarea! Utilice el desbordamiento de pila para algo que no sea una tecla de respuesta. – bobby

Respuesta

30

Dado que está utilizando C++, si quieres xc y yc para cambiar, puede utilizar referencias:

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

Mientras que si estuviera usando C, que tendría que pasar punteros o direcciones explícitas, tales como:

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

yo recomendaría la salida a la C++ FAQ Lite's entry on references de algo más de información sobre el uso de las referencias correctamente.

+0

muchas gracias – Lisa

+0

si usas C++, en general debería llamar por trans (x, y, theta, & xc, y yc) o trans (x, y, theta, xc, yc); – Lisa

+4

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

1

lo necesario para pasar las variables de referencia que significa

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

paso por referencia es de hecho una respuesta correcta, sin embargo, C++ clase-de permite valores múltiples devuelve utilizando std::tuple y (para dos valores) 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); 
} 

De esta manera, no tiene que usar parámetros de salida en absoluto.

Por el lado de la persona que llama, puede utilizar std::tie para descomprimir la tupla en otras variables:

using std::tie; 

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

Espero que esto ayude!

0

como se mencionó anteriormente, debe pasar por referencia para devolver valores alterados de 'm' y 'n', pero ... considere pasar todo por referencia y usar const para los parámetros que no desea que se modifiquen es decir, dentro de su función

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