Lenguaje de programación C (X) Funciones II
1991/12/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
En el sexto capítulo vimos cómo definir y utilizar las funciones que son subprogramas de C. En ella se explicaba la definición de las funciones, la llamada, las referencias que se deben realizar, así como el mecanismo de intercambio de parámetros y resultados. A lo largo de este capítulo analizaremos conceptos más avanzados sobre funciones y demostrativos, función maya, complejas tareas y prototipos de funciones.
Funciones y demostrativos
Se pueden confundir funciones y demostrativos utilizando C de forma natural. Por lo tanto, será posible que el parámetro de una función sea el índice, que el resultado de la función sea demostrativo y que las funciones estén referenciadas mediante demostradores.
Los parámetros serán demostrativos cuando se deben utilizar parámetros por referencia, por ejemplo, cuando se debe dejar el resultado en el parámetro (ver programa 1).
![](images/A54026.jpg)
El resultado de una función, y por tanto el tipo de función, puede ser un demostrador, para lo cual se debe especificar el tipo de datos que se muestra a la izquierda del nombre en la descripción de la función y el carácter * (ver programa 2).
![](images/A54026-a.jpg)
Finalmente, los demostradores para las funciones pueden resultar muy interesantes, ya que nos permiten ejecutar una función o rutina diferente según un dato o código. Un ejemplo claro es el vector de discontinuidades o el módulo de manejo de errores que aparece en el Programa 3. En ella, los nombres de las funciones, al igual que los de las tablas, indican su representativo, por lo que para definir una variable que muestre cualquier función se debe utilizar el símbolo *.
Mediante una asignación localizamos la dirección de la función f en el siguiente programa:
![](images/A54026-b.jpg)
es un texto bien escrito en el que la dirección de f se sitúa en la variable pf.
![](images/A54026-c.jpg)
Función principal
Los programas C deben ser la principal función maya, ya que es la primera que se ejecuta. Si bien hasta el momento se ha utilizado esta función maestra del programa sin parámetros, en ocasiones puede resultar interesante obtener algún dato del comando de ejecución del sistema operativo en tiempo de ejecución. Por ejemplo, cuando queremos hacer un programa que maneje algún fichero tenemos dos opciones: programarlo para un fichero fijo o para cualquier fichero, ya que el nombre del fichero se especificará en el comando de ejecución.
Esta segunda es mucho más general. Cuando se quiera utilizar esta opción, como parámetro del main se deben especificar las palabras clave argc y argv como argumento. A continuación se añadirán argc y argv, el primero de tipo int, y para el segundo se utilizará la expresión char * argv [ ], una tabla de índice para las cadenas de caracteres. Posteriormente, el valor de argc durante el programa será el número de argumentos más uno especificado en el comando, mientras que argv [1] se referirá al primer argumento, argv [2] el segundo, etc., obteniendo el nombre del programa en argv [0]. Se trata de un programa llamado 4 eco (echo) que repite lo que escribimos en la línea de comandos durante la ejecución (si la primera palabra es el nombre de este programa, claro).
![](images/A54026-d.jpg)
Escenarios complejos
En los programas escritos en C aparecen a veces complejos informes en los que resulta difícil conocer qué es el dato declarado. Por ello, los errores descritos en el tercer programa no se entiende inmediatamente la estimación de la variable.
void (* errores [2]) ( )
La principal razón de la dificultad radica en: * mientras el operador escribe por delante [ ] y ( ) por detrás, los agentes de la tabla y de la función tienen más prioridad que los del demostrador, y la asociación es de izquierda a derecha para los agentes [ ] y ( ), pero viceversa para los indicadores.
Lo más sencillo para completar la definición es seguir las siguientes reglas:
- empezando por la izquierda y terminando en nombre.
- aplicando las reglas de preferencia al revés, traducir:
( ) Una tabla compuesta por
[ ] ... que devuelve...
* demostrador para...
Por ejemplo
charX es una tabla de demostradores para caracteres
y
struct S(* (* (* (* (* x) [ ] ) ( ) [ ] ) [ ]Una tabla de demostradores para la función que devuelve el demostrador para la tabla formada por -estructura S es un demostrador en –x
Prototipos de funciones
En el capítulo sexto se analizan los conceptos relacionados con las funciones: definición, gestión y llamada. Mientras en la definición de las funciones se determinan los parámetros formales, citando los tipos correspondientes, en la llamada de funciones se determina el valor instantáneo de los parámetros, pero se producen conversiones no visibles, ya que los números muy cortos se convierten en ints y los reales double . Esto supone una pérdida de eficiencia y además no se producen verificaciones en el intercambio de parámetros. Frente a esto, algunos compiladores C (siguiendo la norma ANSI C), además de mencionar en la referencia funcional el nombre de la función y el tipo de resultado, deben definirse los tipos de datos de los parámetros. Por ejemplo:
extern void fun1 (int, float, char *);
![](images/A54026-e.jpg)
es un prototipo de función donde se especifica el tipo de los tres parámetros en los que se basa la función (int, float y char * ). Si quisiéramos que no hubiera verificaciones en el intercambio de parámetros entonces externn void fun1 ( ), haríamos referencia.
En el programa 5 se puede observar el suceso de un error de compilación debido a la incompatibilidad de parámetros.
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia