4.5.5a Crear estructuras mediante funciones
§1 Sinopsis
Es posible definir funciones que devuelvan estructuras "ad hoc". La creación se controla mediante los argumentos pasados a la función.
§2 Ejemplo
struct punto {int x; int y;} // define tipo estructura punto
struct rect { // define tipo estructura rect
struct punto p1; // compuesta de dos estrucutras
struct punto p2; // tipo punto
}
struct str creapu(int x, int y) // prototipo de función que devuelve
// una estructura (1)
...
struct str creapu (int x, int y) { // definición de creapu
struct punto temp // declara temp estructura tipo punto
temp.x = x;
temp.y = y;
return temp;
}
Comentario
Observe que en (1) el prototipo anuncia que creapu devuelve una estructura, el detalle de como es dicha estructura hay que buscarlo en el cuerpo de la función. Resulta ser de tipo punto, ya definida anteriormente. Así pues, esta función devuelve una estructura tipo punto.
La función creapu puede utilizarse para crear estructuras dinámicamente, o pasarlas como argumento a funciones. Observe que no existe conflicto entre los nombres de los parámetros y los miembros de temp, ya que pertenecen a espacios de nombres distintos.
Veamos el primer caso
(utilizar creapu para crear dinámicamente dos estructuras) completando el código del ejemplo anterior:
rect screen ; // define screen, estructura tipo rect
screen.p1 = creapu(0, 0);
screen.p2 = creapu(80, 24);
Por supuesto, en vez de crear individualmente los componentes de screen, también se podría definir una función que cree directamente una estructura tipo rect a partir de cuatro coordenadas. He aquí su definición:
struct rect creascreen(int x1, int y1, int x2, int y2) {
struct rect temp;
temp.p1.x = x1; temp.p1.y = y1;
temp.p2.x = x2; temp.p2.y = y2;
return temp:
}
A partir de aquí se podría haber definido:
struct rect screen = creascreen(0, 0, 80, 24);
Nota: observe que en términos de rendimiento, la eficacia de esta solución es bastante pobre, ya que la
invocación anterior supone la creación de dos estructuras: la primera, temp, en el cuerpo de la función. La segunda es
una copia de ella en el ámbito de la función invocante (valor devuelto). Cuando las estructuras son muy grandes, la creación y
destrucción de tales objetos puede ser muy costoso en términos de tiempo y recursos. Repasar a este respecto el capítulo relativo
al "Valor devuelto" de las funciones (
4.4.7).