[Duda] - traspaso del valor de las variables
#1

Buenas. Tengo una duda de como se ejecuta el traspaso del valor de estas variables

pawn Код:
public OnGameModeInit()
{
    new x = 2, y = 4;
    myfunc(x, y);
    printf("%d %d", x, y);  // 4 8

}


myfunc(&a, &b)    // passed by reference
{
    a += 2;
    b += 4;
    printf ("%d %d\n", a, b);    // 4 8
}
eso imprime en los dos 4 8, la cosa es que no se como se traspasa un valor a otro, yo lo entiendo asн: es un pase por referencia, con las "&" (aunque dudo de como funciona), deberнa imprimir en la primera 2 4 que son los valores asignados, pero no, estos toman el mismo valor que el de la funciуn. Esta claro que en 'myfunc' imprime 4 8, puesto que usa "+=" lo cual suma el doble de ese valor (2 4 = 4 8 ), pero en la otra parte de las variables x e y, no sй por que imprime ese mismo valor, cuando yo supongo que deberнa imprimir esos valores iniciales asignados (2 - 4). Yo sospecho de que funciona de la siguiente manera: el "&" (que aъn no sй su nombre) toma como referencia como bien lo indica, de los valores de las variables new x, y, luego las suma. Pero experimentando ciertas cosas, probй en colocar:

pawn Код:
a += x;
    b += y;
es decir, colocar directamente el nombre de las variables para saber si es cierto mi teorнa, pero me da error, asi que la descartй. Muchas gracias, y espero que respondan mis inquietudes y mi duda de como se ejecuta el cуdigo.
Reply
#2

El traspaso por referencia es, en efecto, pasando una referencia a un valor -en lugar de una copia del mismo- como un argumento. Los valores de las variables pasadas por referencia se cambian dentro de la misma funciуn, por lo que no tienes que retornarla para saber el valor de la variable alterada. Esto torna especialmente ъtil en funciones donde tienes que retornar dos valores; esto es imposible, asн que los pasa por referencia para modificarlos dentro de la funciуn.

Tu teorнa es cierta, pero te da error ya que "x" y "y" no estan definidos como tal dentro de la funciуn, si no dentro de la callback anterior (OnGameModeInit). Estas variables son liberadas de la memoria al finalizarse, y no existen en la funciуn posterior.

Ahora, si haces esto, tendrбs resultados distintos:
PHP код:
public OnGameModeInit()
{
    new 
24;
    
myfunc(xy24); // conste el бmbito, donde variables "x" y "y" no se relacionan con los argumentos homуnimos de myfunc(), en realidad definen a los argumentos "a" y "b" de dicha funciуn.
    
printf("%d %d"xy);  // 4 8
}
myfunc(&a, &bxy)    // passed by reference
{
    
+= x// aqui x y y ya estбn definidos...
    
+= y
    
printf ("%d %d\n"ab);    // 4 8

Un ejemplo mбs cotidiano:
PHP код:
addToTimestamp(&stamptime)
{
    
stamp += time;
    
// No necesita hacer return, ya la variable se le cambiу el valor
}
new 
timestamp gettime(); // tiempo UNIX
addToTimestamp(timestamp3600); // 3600 = 1 hora
// A partir de este punto, a timestamp se le agregу 3600 
Y un ejemplo que se ve dнa a dнa, pues esta implementado en la funciуn GetPlayerHealth, por ejemplo:
PHP код:
new Float:hp;
GetPlayerHealth(playeridhp);
printf("Health is: %f"hp); 
Reply
#3

Muchas gracias admantis.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)