Autor Tema: [minituto] Como usar punteros para simular multiples retornos  (Leído 2640 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Anyeos

  • Newbie
  • *
  • Mensajes: 39
  • Karma: 5
    • Ver Perfil
[minituto] Como usar punteros para simular multiples retornos
« en: Febrero 10, 2012, 07:00:38 pm »
Aprovecho el hilo para preguntar ejemplificar cómo hago hacer para poder maniobrar punteros directamente con sus valores en una función. O sea, para poder actualizar las variables desde una función que es llamada desde un proceso.

He creado esta función:
Código: [Seleccionar]
Function LimiteVel(int *velx, int *vely, int max);
begin
        if (*velx > max) *velx = max; end
        if (*velx < -max) *velx = -max; end
        if (*vely > max) *vely = max; end
        if (*vely < -max) *vely = -max; end
end

Y la llamada se hace así:
Código: [Seleccionar]
LimiteVel(&Nvelx, &Nvely, 1000);

Esa es la manera más simple de utilizar punteros. O sea con *velx estaremos accediendo al contenido de la variable que asignamos al llamar la función. Si le quitamos el * entonces estaríamos obteniendo la dirección de memoria en donde está almacenado el contenido (que no es lo que queremos). Por eso hay que tener cuidado de cómo se escribe el código cuando usamos punteros.

De donde llamamos a la función tengo declarada Nvelx y Nvely como int. Pero como la función necesita una dirección de memoria como parámetro (en lugar del dato directamente como se haría normalmente), entonces utilizo el operador & delante del nombre de la variable para así enviar como dato la dirección de memoria de la variable Nvelx y Nvely. El tercer parámetro de la función (max) fijense que es un dato común, no pide una dirección de memoria.

Entonces: si declaramos punteros, para acceder a su contenido (y trabajar con él como si fuera una variable común) debemos escribirlo con el * adelante (igual que como lo declaramos).
Y si necesitamos pasar un puntero en una función y lo que tenemos para pasar es una variable común, le anteponemos el &.

Esto es muy util para hacer que la función modifique las variables del proceso en vez de usar un return de donde sacamos un único resultado.
En mi ejemplo lo que hago es limitar la velocidad de una navecita. Eso me ahorra mucho código porque de lo contrario tendría que escribir el código de esa función en cada proceso que quiero limitar la velocidad. En cambio ahora simplemente hago una llamada a la función y automáticamente la velocidad se limita (las variables se modifican directamente).

Bueno, espero haber aclarado un poco el tema de los punteros ya que puede ser un tema un poco difícil de entender porque hay casos más complejos para usar punteros lo que puede confundir un poco. Pero el concepto básico es tan simple como lo que expliqué.

Saludos.

PD: Estaba teniendo problemas con mi función con punteros por eso empecé preguntando pero luego lo solucioné y casi que no escribo este mensaje pero viendo que hay algunas personas (e inclusive yo mismo me había olvidado) que tienen problemas para entender cómo manipular punteros pues decidí mostrar mi ejemplo y explicar un poco.

Desconectado SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12515
  • Karma: 369
  • Sexo: Masculino
    • Ver Perfil
Re:[minituto] Como usar punteros para simular multiples retornos
« Respuesta #1 en: Febrero 10, 2012, 07:57:44 pm »
seguro a muchos le sirve, yo diria que armes un nuevo hilo, porque asi tu consejo/tutorial se pierde.

ponele un titulo acorde y yo lo divido y lo pongo en la seccion de recursos o algo.

karma!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Conectado Fede

  • Hero Member
  • *****
  • Mensajes: 1531
  • Karma: 71
  • Sexo: Masculino
  • Buen ambiente, buen karma.
    • Ver Perfil
Re:[minituto] Como usar punteros para simular multiples retornos
« Respuesta #2 en: Febrero 10, 2012, 11:26:52 pm »
Gracias por la explicación, Anyeos.
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.