Cuando se llama a una función en C, los valores de los parámetros se copian desde el ámbito llamador (lugar en el que está la llamada a la función) al ámbito llamado (el cuerpo de la función). El siguiente programa muestra la ejecución de una función que recibe como parámetro dos estructuras.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <stdio.h> #include <math.h> /* Definición de la estructura */ struct coordenadas { float x; float y; float z; }; /* Definición de función que calcula la distancia entre dos puntos */ float distancia(struct coordenadas a, struct coordenadas b) { return sqrtf(pow(a.x - b.x, 2.0) + pow(a.y - b.y, 2.0) + pow(a.z - b.z, 2.0)); } int main() { /* Declaración e inicialización de dos variables */ struct coordenadas punto_a = { 3.5e-120, 2.5, 1.5 }; struct coordenadas punto_b = { 5.3e-120, 3.1, 6.3 }; float d; /* Almacenar el resultado */ /* Llamada a la función con las dos estructuras */ d = distancia(punto_a, punto_b); /* Imprimir el resultado */ printf("%f\n", d); return 0; } |
En la línea 26 se realiza una copia de las estructuras
punto_a
y punto_b
en el ámbito de la función
main
a las estructuras a
y b
en el
ámbito de la función distancia
. Esta copia tiene dos efectos:
el programa invierte tanto tiempo como datos haya en la estructura, y
durante la ejecución de la función se mantienen en memoria dos copias
completas de las estructuras. El uso de punteros ofrece una alternativa
más eficiente. La función puede reescribirse para que reciba dos
punteros a las estructuras. La definición de la
función pasa a ser:
float distancia(struct coordenadas *a_ptr, struct coordenadas *b_ptr)
{
return sqrtf(pow(a_ptr->x - b_ptr->x, 2.0) +
pow(a_ptr->y - b_ptr->y, 2.0) +
pow(a_ptr->z - b_ptr->z, 2.0));
}
La llamada a la función en la línea 26 pasa ahora a ser
d = distancia(&punto_a, &punto_b);
Con esta nueva versión, el programa ejecuta exactamente los mismos cálculos, obtiene el mismo resultado, pero su ejecución es más rápida, y utiliza menos memoria.
El programa del ejemplo anterior utiliza las funciones
de biblioteca “pow
” y
“sqrtf
”. En una ventana con el intérprete de
comandos utiliza el comando man seguido de cada uno
de estos nombres para averiguar qué hacen. Para utilizar estas funciones
se debe incluir el fichero math.h
mediante la
directiva en la línea 2. Además, la biblioteca de funciones matemáticas
ha de ser incluida explícitamente al compilar mediante la opción
-lm en el comando
gcc -Wall -o programa fichero.c -lm
en el que debes reemplazar
fichero.c
con el nombre de tu fichero.
Modifica el programa del ejemplo para incrementar la precisión en los cálculos. Compara los dos resultados obtenidos.