UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

5.7.2. Estructuras como parámetros

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.

Sugerencia

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.