No sexto capítulo vimos como definir e utilizar as funcións que son subprogramas de C. Nela explicábase a definición das funcións, a chamada, as referencias que se deben realizar, así como o mecanismo de intercambio de parámetros e resultados. Ao longo deste capítulo analizaremos conceptos máis avanzados sobre funcións e demostrativos, función maya, complexas tarefas e prototipos de funcións.
Pódense confundir funcións e demostrativos utilizando C de forma natural. Por tanto, será posible que o parámetro dunha función sexa o índice, que o resultado da función sexa demostrativo e que as funcións estean referenciadas mediante demostradores.
Os parámetros serán demostrativos cando se deben utilizar parámetros por referencia, por exemplo, cando se debe deixar o resultado no parámetro (ver programa 1).
O resultado dunha función, e por tanto o tipo de función, pode ser un demostrador, para o que se debe especificar o tipo de datos que se mostra á esquerda do nome na descrición da función e o carácter * (ver programa 2).
Finalmente, os demostradores paira as funcións poden resultar moi interesantes, xa que nos permiten executar una función ou rutina diferente segundo un dato ou código. Un exemplo claro é o vector de discontinuidades ou o módulo de manexo de erros que aparece no Programa 3. Nela, os nomes das funcións, do mesmo xeito que os das táboas, indican o seu representativo, polo que paira definir una variable que mostre calquera función débese utilizar o símbolo *.
Mediante unha asignación localizamos a dirección da función f no seguinte programa:
é un texto ben escrito no que a dirección de f sitúase na variable pf.
Os programas C deben ser a principal función maya, xa que é a primeira que se executa. Aínda que até o momento utilizouse esta función mestra do programa sen parámetros, en ocasións pode resultar interesante obter algún dato do comando de execución do sistema operativo en tempo de execución. Por exemplo, cando queremos facer un programa que manexe algún ficheiro temos dúas opcións: programalo paira un ficheiro fixo ou paira calquera ficheiro, xa que o nome do ficheiro especificarase no comando de execución.
Esta segunda é moito máis xeral. Cando se queira utilizar esta opción, como parámetro do main débense especificar as palabras crave argc e argv como argumento. A continuación engadiranse argc e argv, o primeiro de tipo int, e paira o segundo utilizarase a expresión char * argv [ ], una táboa de índice paira as cadeas de caracteres. Posteriormente, o valor de argc durante o programa será o número de argumentos máis uno especificado no comando, mentres que argv [1] referirase ao primeiro argumento, argv [2] o segundo, etc., obtendo o nome do programa en argv [0]. Trátase dun programa chamado 4 eco (boto) que repite o que escribimos na liña de comandos durante a execución (se a primeira palabra é o nome deste programa, claro).
Nos programas escritos en C aparecen ás veces complexos informes nos que resulta difícil coñecer que é o dato declarado. Por iso, os erros descritos no terceiro programa non se entende inmediatamente a estimación da variable.
void (* erros [2]) ( )
A principal razón da dificultade radica en: * mentres o operador escribe por diante [ ] e ( ) por detrás, os axentes da táboa e da función teñen máis prioridade que os do demostrador, e a asociación é de esquerda a dereita paira os axentes [ ] e ( ), pero viceversa paira os indicadores.
O máis sinxelo paira completar a definición é seguir as seguintes regras:
( ) Una táboa composta por [
] ... que devolve...
* demostrador paira...
Por exemplo
charX é una táboa de demostradores paira caracteres
e
struct S(* (* (* (* (* x) [ ] ) ( ) [ ] ) [ ]Una táboa de demostradores paira a función que devolve o demostrador paira a táboa formada por -estrutura S é un demostrador en –x
No capítulo sexto analízanse os conceptos relacionados coas funcións: definición, xestión e chamada. Mentres na definición das funcións determínanse os parámetros formais, citando os tipos correspondentes, na chamada de funcións determínase o valor instantáneo dos parámetros, pero se producen conversiones non visibles, xa que os números moi curtos convértense en ints e os reais double . Isto supón una perda de eficiencia e ademais non se producen verificacións no intercambio de parámetros. Fronte a isto, algúns compiladores C (seguindo a norma ANSI C), ademais de mencionar na referencia funcional o nome da función e o tipo de resultado, deben definirse os tipos de datos dos parámetros. Por exemplo:
extern void fun1 (int, float, char *);
é un prototipo de función onde se especifica o tipo dos tres parámetros nos que se basea a función (int, float e char * ). Se quixésemos que non houbese verificacións no intercambio de parámetros entón externn void fun1 ( ), fariamos referencia.
No programa 5 pódese observar o suceso dun erro de compilación debido á incompatibilidade de parámetros.