Llenguatge de programació C (X) Funcions II

Al llarg d'aquest capítol analitzarem conceptes més avançats sobre funcions i demostradors, la maia, complexes tasques i prototips de funcions.

En el sisè capítol vam veure com definir i utilitzar les funcions que són subprogrames de C. En ella s'explicava la definició de les funcions, la crida, les referències que s'han de realitzar, així com el mecanisme d'intercanvi de paràmetres i resultats. Al llarg d'aquest capítol analitzarem conceptes més avançats sobre funcions i demostratius, funció maia, complexes tasques i prototips de funcions.

Funcions i demostratius

Es poden confondre funcions i demostratius utilitzant C de manera natural. Per tant, serà possible que el paràmetre d'una funció sigui l'índex, que el resultat de la funció sigui demostratiu i que les funcions estiguin referenciades mitjançant demostradors.

Els paràmetres seran demostratius quan s'han d'utilitzar paràmetres per referència, per exemple, quan s'ha de deixar el resultat en el paràmetre (veure programa 1).

Programa 1. Classificació de tres números.

El resultat d'una funció, i per tant el tipus de funció, pot ser un demostrador, per a això s'ha d'especificar el tipus de dades que es mostra a l'esquerra del nom en la descripció de la funció i el caràcter * (veure programa 2).

Programa 2. Una funció tipus demostrador.

Finalment, els demostradors per a les funcions poden resultar molt interessants, ja que ens permeten executar una funció o rutina diferent segons una dada o codi. Un exemple clar és el vector de discontinuïtats o el mòdul de maneig d'errors que apareix en el Programa 3. En ella, els noms de les funcions, igual que els de les taules, indiquen el seu representatiu, per la qual cosa per a definir una variable que mostri qualsevol funció s'ha d'utilitzar el símbol *.

Mitjançant una assignació localitzem la direcció de la funció f en el següent programa:

és un text ben escrit en el qual l'adreça de f se situa en la variable pf.

Programa 3. Mòdul de tractament d'errors.

Funció principal

Els programes C han de ser la principal funció maia, ja que és la primera que s'executa. Si bé fins al moment s'ha utilitzat aquesta funció mestra del programa sense paràmetres, a vegades pot resultar interessant obtenir alguna dada del comando d'execució del sistema operatiu en temps d'execució. Per exemple, quan volem fer un programa que manegi algun fitxer tenim dues opcions: programar-ho per a un fitxer fix o per a qualsevol fitxer, ja que el nom del fitxer s'especificarà en el comando d'execució.

Aquesta segona és molt més general. Quan es vulgui utilitzar aquesta opció, com a paràmetre del main s'han d'especificar les paraules clau argc i argv com a argument. A continuació s'afegiran argc i argv, el primer de tipus int, i per al segon s'utilitzarà l'expressió char * argv [ ], una taula d'índex per a les cadenes de caràcters. Posteriorment, el valor d'argc durant el programa serà el nombre d'arguments més un especificat en el comando, mentre que argv [1] es referirà al primer argument, argv [2] el segon, etc., obtenint el nom del programa en argv [0]. Es tracta d'un programa anomenat 4 ressò (tiro) que repeteix el que escrivim en la línia de comandos durant l'execució (si la primera paraula és el nom d'aquest programa, clar).

Programa 4. Programa de ressò.

Escenaris complexos

En els programes escrits en C apareixen a vegades complexos informes en els quals resulta difícil conèixer què és la dada declarada. Per això, els errors descrits en el tercer programa no s'entén immediatament l'estimació de la variable.

void (* errors [2]) ( )

La principal raó de la dificultat radica en: * mentre l'operador escriu per davant [ ] i ( ) per darrere, els agents de la taula i de la funció tenen més prioritat que els del demostrador, i l'associació és d'esquerra a dreta per als agents [ ] i ( ), però viceversa per als indicadors.

El més senzill per a completar la definició és seguir les següents regles:

  • començant per l'esquerra i acabant en nom.
  • aplicant les regles de preferència a l'inrevés, traduir:

( ) Una taula composta per
[ ] ... que retorna...
* demostrador per a...

Per exemple

char

X és una taula de demostradors per a caràcters

i

struct S(* (* (* (* (* x) [ ] ) ( ) [ ] ) [ ]

Una taula de demostradors per a la funció que retorna el demostrador per a la taula formada per -estructura S és un demostrador en –x

Prototips de funcions

En el capítol sisè s'analitzen els conceptes relacionats amb les funcions: definició, gestió i crida. Mentre en la definició de les funcions es determinen els paràmetres formals, citant els tipus corresponents, en la crida de funcions es determina el valor instantani dels paràmetres, però es produeixen conversions no visibles, ja que els números molt curts es converteixen en ints i els reals double . Això suposa una pèrdua d'eficiència i a més no es produeixen verificacions en l'intercanvi de paràmetres. Enfront d'això, alguns compiladors C (seguint la norma ANSI C), a més d'esmentar en la referència funcional el nom de la funció i el tipus de resultat, han de definir-se els tipus de dades dels paràmetres. Per exemple:

extern void fun1 (int, float, char *);

Programa 5. Utilització d'un prototip.

és un prototip de funció on s'especifica el tipus dels tres paràmetres en els quals es basa la funció (int, float i char * ). Si volguéssim que no hi hagués verificacions en l'intercanvi de paràmetres llavors externn void fun1 ( ), faríem referència.

En el programa 5 es pot observar el succés d'un error de compilació a causa de la incompatibilitat de paràmetres.

Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila